Как правильно делать периодические действия?

259 views
Skip to first unread message

Max Pantuhin

unread,
Aug 4, 2016, 6:15:40 AM8/4/16
to Erlang по-русски
Помогите разобраться.
Нужно было сделать некие периодические действия - проверять чего-то там через промежутки времени. Строго выдержывать промежутки не надо.

Я реализовал на gen_server-е - он в конце проверки вызывает erlang:send_after самому-себе и референс на таймер запоминает.
При получении такого сообщения таймер по референсу удаляет, делает проверки и ставит новый таймер.

Коллега мой говорит, что я нарушил паттерн и надо было делать на gen_fsm. А по моему, зачем? Состояний же нет.
--
Кто прав?

Artem Golovinsky

unread,
Aug 4, 2016, 6:20:16 AM8/4/16
to erlang-...@googlegroups.com
Вообще в генсервере есть штука специальная для этого  - можно вернуть timeout. Почитайте документацию как его использовать.

Ваш коллега неправ. Вводить новую и довольно сложную сущность ради таймера нет никакого смысла. 
В большинстве случаев генсервер вполне себе заменяет генфсм.

4 августа 2016 г., 13:15 пользователь 'Max Pantuhin' via Erlang по-русски <erlang-...@googlegroups.com> написал:

--
Вы получили это сообщение, поскольку подписаны на группу "Erlang по-русски".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес erlang-russian+unsubscribe@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес erlang-russian@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.



--
Best regards,
Artem Golovinsky

Paul Peregud

unread,
Aug 4, 2016, 6:27:03 AM8/4/16
to erlang-...@googlegroups.com
По поводу timeout.

"If an integer timeout value is provided, a timeout will occur unless
a request or a message is received withinTimeout milliseconds."

Т.е. любое другое сообщение отменит timeout. Как по мне - это
напрашиваться на ошибки.


2016-08-04 12:20 GMT+02:00 Artem Golovinsky <artemgo...@gmail.com>:
> Вообще в генсервере есть штука специальная для этого - можно вернуть
> timeout. Почитайте документацию как его использовать.
>
> Ваш коллега неправ. Вводить новую и довольно сложную сущность ради таймера
> нет никакого смысла.
> В большинстве случаев генсервер вполне себе заменяет генфсм.
>
> 4 августа 2016 г., 13:15 пользователь 'Max Pantuhin' via Erlang по-русски
> <erlang-...@googlegroups.com> написал:
>
>> Помогите разобраться.
>> Нужно было сделать некие периодические действия - проверять чего-то там
>> через промежутки времени. Строго выдержывать промежутки не надо.
>>
>> Я реализовал на gen_server-е - он в конце проверки вызывает
>> erlang:send_after самому-себе и референс на таймер запоминает.
>> При получении такого сообщения таймер по референсу удаляет, делает
>> проверки и ставит новый таймер.
>>
>> Коллега мой говорит, что я нарушил паттерн и надо было делать на gen_fsm.
>> А по моему, зачем? Состояний же нет.
>> --
>> Кто прав?
>>
>> --
>> Вы получили это сообщение, поскольку подписаны на группу "Erlang
>> по-русски".
>> Чтобы отменить подписку на эту группу и больше не получать от нее
>> сообщения, отправьте письмо на электронный адрес
>> erlang-russia...@googlegroups.com.
>> Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный
>> адрес erlang-...@googlegroups.com.
>> Чтобы настроить другие параметры, перейдите по ссылке
>> https://groups.google.com/d/optout.
>
>
>
>
> --
> Best regards,
> Artem Golovinsky
>
> --
> Вы получили это сообщение, поскольку подписаны на группу "Erlang по-русски".
> Чтобы отменить подписку на эту группу и больше не получать от нее сообщения,
> отправьте письмо на электронный адрес
> erlang-russia...@googlegroups.com.
> Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный
> адрес erlang-...@googlegroups.com.
> Чтобы настроить другие параметры, перейдите по ссылке
> https://groups.google.com/d/optout.



--
Best regards,
Paul Peregud
+48602112091

Artem Golovinsky

unread,
Aug 4, 2016, 6:29:23 AM8/4/16
to erlang-...@googlegroups.com
Да есть такая тема. Если генсервер принимает/делает еще что-то кроме периодического тика и каких-то действий он не применим. А так, почему нет? просто не слать ему сообщения и все будет хорошо.

4 августа 2016 г., 13:27 пользователь Paul Peregud <paulp...@gmail.com> написал:
По поводу timeout.

"If an integer timeout value is provided, a timeout will occur unless
a request or a message is received withinTimeout milliseconds."

Т.е. любое другое сообщение отменит timeout. Как по мне - это
напрашиваться на ошибки.


2016-08-04 12:20 GMT+02:00 Artem Golovinsky <artemgo...@gmail.com>:
> Вообще в генсервере есть штука специальная для этого  - можно вернуть
> timeout. Почитайте документацию как его использовать.
>
> Ваш коллега неправ. Вводить новую и довольно сложную сущность ради таймера
> нет никакого смысла.
> В большинстве случаев генсервер вполне себе заменяет генфсм.
>
> 4 августа 2016 г., 13:15 пользователь 'Max Pantuhin' via Erlang по-русски
> <erlang-russian@googlegroups.com> написал:

>
>> Помогите разобраться.
>> Нужно было сделать некие периодические действия - проверять чего-то там
>> через промежутки времени. Строго выдержывать промежутки не надо.
>>
>> Я реализовал на gen_server-е - он в конце проверки вызывает
>> erlang:send_after самому-себе и референс на таймер запоминает.
>> При получении такого сообщения таймер по референсу удаляет, делает
>> проверки и ставит новый таймер.
>>
>> Коллега мой говорит, что я нарушил паттерн и надо было делать на gen_fsm.
>> А по моему, зачем? Состояний же нет.
>> --
>> Кто прав?
>>
>> --
>> Вы получили это сообщение, поскольку подписаны на группу "Erlang
>> по-русски".
>> Чтобы отменить подписку на эту группу и больше не получать от нее
>> сообщения, отправьте письмо на электронный адрес

>> Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный

>> Чтобы настроить другие параметры, перейдите по ссылке
>> https://groups.google.com/d/optout.
>
>
>
>
> --
> Best regards,
> Artem Golovinsky
>
> --
> Вы получили это сообщение, поскольку подписаны на группу "Erlang по-русски".
> Чтобы отменить подписку на эту группу и больше не получать от нее сообщения,
> отправьте письмо на электронный адрес

> Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный

> Чтобы настроить другие параметры, перейдите по ссылке
> https://groups.google.com/d/optout.



--
Best regards,
Paul Peregud
+48602112091

--
Вы получили это сообщение, поскольку подписаны на группу Erlang по-русски.

Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес erlang-russian+unsubscribe@googlegroups.com.
Чтобы добавлять сообщения в эту группу, отправьте письмо по адресу erlang-russian@googlegroups.com.
Настройки подписки и доставки писем: https://groups.google.com/d/optout.

Max Pantuhin

unread,
Aug 4, 2016, 6:29:42 AM8/4/16
to Erlang по-русски
Про timeout знаю. Просто я не захотел его использовать - потому что не говорящее сообщение.
На самом деле я делаю чуть хитрее - делаю sendafter, но и возвращаю результат так, чтобы был отправлен timeout но через промежуток - период указанный в senafter + 10 секунд.


четверг, 4 августа 2016 г., 13:20:16 UTC+3 пользователь Artem Golovinsky написал:
Вообще в генсервере есть штука специальная для этого  - можно вернуть timeout. Почитайте документацию как его использовать.

Ваш коллега неправ. Вводить новую и довольно сложную сущность ради таймера нет никакого смысла. 
В большинстве случаев генсервер вполне себе заменяет генфсм.
4 августа 2016 г., 13:15 пользователь 'Max Pantuhin' via Erlang по-русски <erlang-...@googlegroups.com> написал:
Помогите разобраться.
Нужно было сделать некие периодические действия - проверять чего-то там через промежутки времени. Строго выдержывать промежутки не надо.

Я реализовал на gen_server-е - он в конце проверки вызывает erlang:send_after самому-себе и референс на таймер запоминает.
При получении такого сообщения таймер по референсу удаляет, делает проверки и ставит новый таймер.

Коллега мой говорит, что я нарушил паттерн и надо было делать на gen_fsm. А по моему, зачем? Состояний же нет.
--
Кто прав?

--
Вы получили это сообщение, поскольку подписаны на группу "Erlang по-русски".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес erlang-russia...@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес erlang-...@googlegroups.com.

Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

авоська

unread,
Aug 4, 2016, 6:32:30 AM8/4/16
to Erlang по-русски
ещё apply_interval есть

Dmitry Dmitriy

unread,
Aug 4, 2016, 6:56:53 AM8/4/16
to Erlang по-русски
Есть вариант, который подходит для многократного использования.
Можете создать gen_timer_server на базе gen_server.
В нем переопределите handle_call, handle_cast и handle_info, таким образом, что возвращаемое значение таймаута из коллбека модуля-реализации бехивера, не просто возвращалось бы в gen_server, а сохранялось в стейте get_timer_server вместе с таймстемпом взведения таймера. После обработки любого сообщения оставшееся время будет пересчитываться в gen_timer_server, и возвращаться в gen_server уже модифицированное. Таким образом таймер будет срабатывать через равные промежутки времени, и пришедшие сообщения не будут отменять его.
Помимо этого, данный бехивер позволит в любой момент синхронно отменить таймер, не парясь, что он например уже сработал и лежит в месседж боксе.
Ну и опять же переиспользование.
А кода минимум)
Если одного таймера мало, можете развить схему до контейнера таймеров.

четверг, 4 августа 2016 г., 16:29:42 UTC+6 пользователь Max Pantuhin написал:

Aleksey Kluchnikov

unread,
Aug 4, 2016, 7:02:31 AM8/4/16
to erlang-russian
И так и эдак пробовал. В результате пока остановился на хранении поля #{until := Until} в стейте генсервера. Из него каждый раз выссчитываю таймаут. Тожe кривовато, но в моем случае по сумме нюансов выгодней чем сенд_афтер.

4 августа 2016 г., 14:56 пользователь Dmitry Dmitriy <pear.knoc...@gmail.com> написал:

Alexandre Beniaminov

unread,
Aug 4, 2016, 9:54:49 AM8/4/16
to erlang-...@googlegroups.com
Попробуйте написать gen_fsm, хотя бы из любопытства. Автомат с двумя состояниями: работаю - не работаю (опрашиваю - не опрашиваю). Получится очень компактно.

Еще есть вариант  - special process. 
  

4 августа 2016 г., 14:02 пользователь Aleksey Kluchnikov <kluchn...@gmail.com> написал:
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес erlang-russian+unsubscribe@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес erlang-russian@googlegroups.com.

Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
Вы получили это сообщение, поскольку подписаны на группу "Erlang по-русски".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес erlang-russian+unsubscribe@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес erlang-russian@googlegroups.com.

Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.



--
С уважением,
Александр Бениаминов

hiend

unread,
Aug 4, 2016, 2:20:37 PM8/4/16
to Erlang по-русски
Таймаут в генсервере нужен для обработки insufficient data, не используйте его для периодических интервалов.
Используйте  для подобного только erlang:start_timer, референс таймера сохранять смысла нет, если нет ситуаций
когда вы его отменяете.

Использовать gen_fsm тут вообще глупость, сам таймер играет роль состояния, этого достаточно.
Держитесь подальше от любителей повсюду совать стейт-машины, они нужны редко, но когда они нужны, это сразу очевидно.

четверг, 4 августа 2016 г., 14:15:40 UTC+4 пользователь Max Pantuhin написал:

Max Lapshin

unread,
Aug 5, 2016, 2:52:01 AM8/5/16
to erlang-...@googlegroups.com
Я помню своё непонимание, зачем вообще нужен gen_fsm, помню разговоры на EUC аж 2011 о том, что нахера вообще вы оставили gen_fsm, если он коряв и костляв.

Ну и в результате сейчас gen_statem, т.е. практика показывает, что gen_fsm в топку.


Периодические действия можно сделать или на имплементации крона в эрланге, или просто на gen_server.  На gen_server который следит за одной конкретной задачей получится надежнее.

Max Pantuhin

unread,
Aug 5, 2016, 4:51:42 AM8/5/16
to Erlang по-русски
Ну в моей реализации референс таймера как раз смысл сохранять есть. Я его отменяю в момент получения сообщения, что надо сделать мое периодическое действие - вдруг мне такое сообщение со стороны пошлют (например для отладки или еще для чего-то) - и тогда родится уже два таймера. Поэтому таймер надо отменять при таком подходе как у меня.




четверг, 4 августа 2016 г., 21:20:37 UTC+3 пользователь hiend написал:

Alexandre Beniaminov

unread,
Aug 5, 2016, 10:25:58 AM8/5/16
to erlang-...@googlegroups.com
"Вы не любите кошек? Просто вы не умеете их готовить".

Скажу сразу, что я не фанат gen_fsm. И для КА с большим количеством состояний или со сложной таблицей переходов писать gen_fsm - это для сильных духом. Для таких КА есть другие методы ;)

Но для поставленной задачи он подходит безусловно и получается простым до смешного . Не буду голословен: 


В описании gen_fsm есть  двусмысленность в отношении таймаутов. Есть клиентский таймаут и есть таймаут состояния, а обозначаются они одним атомом: timeout. Клиентский т-аут по смыслу как в gen_server, а т-аут состояния означает, что если в течении времени т-аута не пришло никаких сообщений из внешнего мира, то надо что-то делать: остаться в этом же состоянии  , перейти в другое  и т.д. Вот этот тип т-аута и можно использовать: 



Эта же задача грубо решается с помощью простого специального OTP процесса и timer:sleep(T): 


Грубость в том, что на время T сервер блокируется выполнением sleep.

Неблокирующим будет вариант спец процесса со start_timer - cancel_timer  


В последний пример вносил изменения, не проверяя. Если что не так, пишите 


ЗЫ Все примеры на тему запроса из очереди  в Redis

5 августа 2016 г., 11:51 пользователь 'Max Pantuhin' via Erlang по-русски <erlang-...@googlegroups.com> написал:

--
Вы получили это сообщение, поскольку подписаны на группу "Erlang по-русски".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес erlang-russian+unsubscribe@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес erlang-russian@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Max Pantuhin

unread,
Aug 5, 2016, 10:58:50 AM8/5/16
to Erlang по-русски
Беда вся в том, что gen_server такой же простой и так же подходит для решения этой задачи.



пятница, 5 августа 2016 г., 17:25:58 UTC+3 пользователь Alexandr Beniaminov написал:
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес erlang-russia...@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес erlang-...@googlegroups.com.

Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Alexandre Beniaminov

unread,
Aug 5, 2016, 11:20:49 AM8/5/16
to erlang-...@googlegroups.com
По сравнению с реализацией на gen_fsm реализация на gen_server не может быть проще из-за возни со start_timer, cancel_timer. Реализация на gen_server конечно проще, чем спец процесс, но и тяжелее по производительности 

5 августа 2016 г., 17:58 пользователь 'Max Pantuhin' via Erlang по-русски <erlang-...@googlegroups.com> написал:
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес erlang-russian+unsubscribe@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес erlang-russian@googlegroups.com.

Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Denis Fakhrtdinov

unread,
Aug 5, 2016, 11:39:54 AM8/5/16
to erlang-...@googlegroups.com
Вы уже второй день обсуждаете давно решенную проблему, рассуждая о производительности таймеров и ненужном fsm. Упоролись на отличненько.

Alexander Chemeris

unread,
Aug 5, 2016, 12:21:07 PM8/5/16
to erlang-...@googlegroups.com


2016-08-05 17:25 GMT+03:00 Alexandre Beniaminov <abeni...@gmail.com>:
Скажу сразу, что я не фанат gen_fsm. И для КА с большим количеством состояний или со сложной таблицей переходов писать gen_fsm - это для сильных духом. Для таких КА есть другие методы ;)

Кстати, а что лучше использовать для более серьёзной FSM, например для какого-нибудь коммуникационного протокола? Например, чтобы можно было описать полную таблицу переходов в виде матрицы или списка и просто указать callbacks, которые вызывать при том или ином переходе. gen_fsm совсем не впечатлил, gen_statem выглядит уже лучше, но верится в то, что есть что-то более удобное.

--
Regards,
Alexander Chemeris.
CEO, Fairwaves, Inc.
https://fairwaves.co

Alexandre Beniaminov

unread,
Aug 5, 2016, 2:55:13 PM8/5/16
to erlang-...@googlegroups.com
Например, чтобы можно было описать полную таблицу переходов в виде матрицы или списка и просто указать callbacks, которые вызывать при том или ином переходе

Да, я вот так и делал:

все состояния пронумерованы

в ets ordered_set хранятся переходы, например:
...
{346 , wait, signal, move_forward, 1000, 347, 386} %% состояние 346, в течении 1 секунды ждать сигнала двигаться вперед, если дождался переход в состояние 347, нет - 386
 
{347, sense, ahead, 1, 348, 387}
...  

self-активный процесс, типа того, который обсуждался в этой ветке,  в стейте которого лежит текущее состояние,  в цикле запрашивает по этому состоянию переход из таблицы lookup - ом. Зная, что второй элемент - имя действия, а остальные элементы - параметры,  вызывает соответсвующую функцию апплаем. Запоминает в стейте новое состояние и вызывает цикл. 





5 августа 2016 г., 19:20 пользователь Alexander Chemeris <alexander...@gmail.com> написал:

--
Вы получили это сообщение, поскольку подписаны на группу "Erlang по-русски".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес erlang-russian+unsubscribe@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес erlang-russian@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Alexander Chemeris

unread,
Aug 5, 2016, 3:05:41 PM8/5/16
to erlang-...@googlegroups.com



On Aug 5, 2016 9:55 PM, "Alexandre Beniaminov" <abeni...@gmail.com> wrote:
>>
>> Например, чтобы можно было описать полную таблицу переходов в виде матрицы или списка и просто указать callbacks, которые вызывать при том или ином переходе
>
>
> Да, я вот так и делал:
>
> все состояния пронумерованы
>
> в ets ordered_set хранятся переходы, например:
> ...
> {346 , wait, signal, move_forward, 1000, 347, 386} %% состояние 346, в течении 1 секунды ждать сигнала двигаться вперед, если дождался переход в состояние 347, нет - 386
>  
> {347, sense, ahead, 1, 348, 387}
> ...  
>
> self-активный процесс, типа того, который обсуждался в этой ветке,  в стейте которого лежит текущее состояние,  в цикле запрашивает по этому состоянию переход из таблицы lookup - ом. Зная, что второй элемент - имя действия, а остальные элементы - параметры,  вызывает соответсвующую функцию апплаем. Запоминает в стейте новое состояние и вызывает цикл. 
>

Вот я к раз думаю про что-то подобное, посмотрев, как FSM реализованы в Osmocom (на С).

У меня только один вопрос - неужели нет какой-то стандартной библиотеки для этого? Это же куда компактнее и удобнее, чем все эти gen_fsm.

Please excuse typos. Written with a touchscreen keyboard.

--
Regards,
Alexander Chemeris
CEO Fairwaves, Inc.
https://fairwaves.co

Alexandre Beniaminov

unread,
Aug 5, 2016, 3:48:37 PM8/5/16
to erlang-...@googlegroups.com
Я не нашел такой библиотеки. Основная сложность, как мне кажется, в создании такой большой матрицы переходов. Правда, часто  она бывает сильно разрежена и с выраженной кластерностью, тем самым напрашивается мысль об языке описания переходов ( не самих функций действия).      

5 августа 2016 г., 22:05 пользователь Alexander Chemeris <alexander...@gmail.com> написал:

--
Вы получили это сообщение, поскольку подписаны на группу "Erlang по-русски".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес erlang-russian+unsubscribe@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес erlang-russian@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Max Lapshin

unread,
Aug 5, 2016, 5:23:40 PM8/5/16
to erlang-...@googlegroups.com
Я не понимаю, как прогать протоколы на gen_fsm.

Как это тестировать то?  Тесты более чем на 2-3 процесса уже превращаются в костыли и подпорки для синхронизации, что бы они не мигали

Alexander Chemeris

unread,
Aug 5, 2016, 5:35:17 PM8/5/16
to erlang-...@googlegroups.com
2016-08-06 0:23 GMT+03:00 Max Lapshin <max.l...@gmail.com>:
Я не понимаю, как прогать протоколы на gen_fsm.

Слышу глас специалиста. Что посоветуешь?

Как это тестировать то?  Тесты более чем на 2-3 процесса уже превращаются в костыли и подпорки для синхронизации, что бы они не мигали

Откуда тут больше 2 процессов (FSM и тестер)?

--
Regards,
Alexander Chemeris.
CEO, Fairwaves, Inc.
https://fairwaves.co

Max Lapshin

unread,
Aug 6, 2016, 3:43:29 AM8/6/16
to erlang-...@googlegroups.com
Ты меня спрашиваешь про то, откуда будет больше двух процессов, а я вспоминаю анекдот про то, откуда брать дерьмо что бы им обмазаться при охоте на медведя: оно будет.


на моей практике самый стабильный способ тестирования сетевых протоколов это иметь апи вида:

mymodule:decode(BinaryChunk, State) -> {[Outpackets], State1}

такое хоть протестировать можно

--

Dmitry Dmitriy

unread,
Aug 6, 2016, 5:01:24 AM8/6/16
to Erlang по-русски
Зачем нужна матрица переходов?
Нужен список коллбеков для каждого состояния и больше ничего не нужно. Вы же не собираетесь валидировать допустимость перехода в рантайме. Так и накуа? Матрица переходов, или представление ДКА в виде графа нужно чтобы его на бумаге можно было нарисовать и исследовать.
Каждый коллбек сам решает по какому сообщению в какое состояние автомату скакать, вот и усё.
Простейший ДКА можно и без бехиверов изобразить на case clause.

handle_cast(Msg, Data= #data{current_state = CurrentState}}) ->



суббота, 6 августа 2016 г., 2:48:37 UTC+7 пользователь Alexandr Beniaminov написал:
Я не нашел такой библиотеки. Основная сложность, как мне кажется, в создании такой большой матрицы переходов. Правда, часто  она бывает сильно разрежена и с выраженной кластерностью, тем самым напрашивается мысль об языке описания переходов ( не самих функций действия).      
5 августа 2016 г., 22:05 пользователь Alexander Chemeris <alexander...@gmail.com> написал:



On Aug 5, 2016 9:55 PM, "Alexandre Beniaminov" <abeni...@gmail.com> wrote:
>>
>> Например, чтобы можно было описать полную таблицу переходов в виде матрицы или списка и просто указать callbacks, которые вызывать при том или ином переходе
>
>
> Да, я вот так и делал:
>
> все состояния пронумерованы
>
> в ets ordered_set хранятся переходы, например:
> ...
> {346 , wait, signal, move_forward, 1000, 347, 386} %% состояние 346, в течении 1 секунды ждать сигнала двигаться вперед, если дождался переход в состояние 347, нет - 386
>  
> {347, sense, ahead, 1, 348, 387}
> ...  
>
> self-активный процесс, типа того, который обсуждался в этой ветке,  в стейте которого лежит текущее состояние,  в цикле запрашивает по этому состоянию переход из таблицы lookup - ом. Зная, что второй элемент - имя действия, а остальные элементы - параметры,  вызывает соответсвующую функцию апплаем. Запоминает в стейте новое состояние и вызывает цикл. 
>

Вот я к раз думаю про что-то подобное, посмотрев, как FSM реализованы в Osmocom (на С).

У меня только один вопрос - неужели нет какой-то стандартной библиотеки для этого? Это же куда компактнее и удобнее, чем все эти gen_fsm.

Please excuse typos. Written with a touchscreen keyboard.

--
Regards,
Alexander Chemeris
CEO Fairwaves, Inc.
https://fairwaves.co

--
Вы получили это сообщение, поскольку подписаны на группу "Erlang по-русски".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес erlang-russia...@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес erlang-...@googlegroups.com.

Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Dmitry Dmitriy

unread,
Aug 6, 2016, 5:02:11 AM8/6/16
to Erlang по-русски
блин, само раньше времени отправилось) ну, я думаю все и так меня поняли!)

суббота, 6 августа 2016 г., 16:01:24 UTC+7 пользователь Dmitry Dmitriy написал:

Alexandre Beniaminov

unread,
Aug 6, 2016, 4:11:51 PM8/6/16
to erlang-...@googlegroups.com
Каждый коллбек сам решает по какому сообщению в какое состояние автомату скакать, вот и усё.

это и есть основная идея  gen_fsm оформленная в бихейвиа 

6 августа 2016 г., 12:02 пользователь Dmitry Dmitriy <pear.knoc...@gmail.com> написал:
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес erlang-russian+unsubscribe@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес erlang-russian@googlegroups.com.

Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Dmitry Dmitriy

unread,
Aug 8, 2016, 1:59:35 AM8/8/16
to Erlang по-русски
Это и есть основная идея любой стейт машины)

воскресенье, 7 августа 2016 г., 2:11:51 UTC+6 пользователь Alexandr Beniaminov написал:

Evgeny M

unread,
Aug 8, 2016, 9:41:05 AM8/8/16
to Erlang по-русски
Можно еще посмотреть https://github.com/uwiger/jobs - в частности producers
Хотя для большинства случаев это оверкилл

четверг, 4 августа 2016 г., 13:15:40 UTC+3 пользователь Max Pantuhin написал:
Reply all
Reply to author
Forward
0 new messages