Pull to refresh

Comments 2

Почему всё так сложно. В Эрланге достаточно просто добавить after timeout в receive.

Почему всё так сложно. В Эрланге...
Прямое сравнение с Erlang-ом неправомочно по двум причинам.

Во-первых, Erlang реализует для своих процессов вытесняющую многозадачность. Поэтому в Erlang-е процесс может «заснуть» на receive и это не повлияет на другие процессы. В SObjectizer-е для агентов, в общем случае, реализуется не вытесняющая, а кооперативная многозадачность. Поэтому агент должен отдать управление назад SObjectizer-у после того, как завершит обработку очередного сообщения. Т.е. должен вернуться из своего текущего обработчика. Из-за этого уже получается, что если в SO-5 агент хочет отослать сообщение другому агенту и подождать ответ, то агенту нужно два метода-обработчика (в одном он отсылает свой запрос, в другом получает ответ) + кухня по подписке-отписке. Ну и при наличии тайм-аутов это еще более усложняется.

С Erlang-ом в этом плане можно сравнивать такие реализации Модели Акторов, в которых акторы представлены отдельными потоками выполнения. Например, каждому актору выдается своя нить ОС или своя зеленая нить/файбер. Скажем, в SO-5 вы можете привязать агентов к диспетчерам так, что у каждого агента будет своя рабочая нить. Тогда вместо манипуляций с подпиской/отпиской можно будет использовать CSP-каналы (mchains). И ожидание ответов может быть записано как:
receive(from(ch).total_time(5s),
  [this](mhood_t<successful_reply> cmd) {...},
  [this](mhood_t<failed_reply> cmd) {...});


Во-вторых, SObjectizer использует для взаимодействия агентов механизм publish-subscribe. Он в принципе отличается от того, что принято в Модели Акторов вообще (там жестко один почтовый ящик у актора) и в Erlang-е в частности (там одна единственная очередь сообщений для процесса да плюс еще и selective receive). Поэтому показанный пример имело бы смысл сравнивать с реализацией взаимодействия через какой-то MQ-шный брокер и несколько топиков в этом брокере.

Ну и заодно хочу спросить. А вот, допустим, в Erlang-е вы отослали сообщения трем процессам и вам нужно дождаться ответов от них. Только один ответ нужно ждать не более N секунд, второй — не более M, третий не более L. Как между собой соотносятся N, M и L неизвестно. Так же вы должны обрабатывать ответные сообщения в том порядке, в котором они приходят (а не сперва от первого, затем от второго, затем от третьего). Как это будет выглядеть в Erlang-е? Полагаю, в виде цикла, на каждой итерации которого вы будете вынуждены вычислять наименьший из оставшихся тайм-аутов и это значение будете подставлять в after timeout.
Sign up to leave a comment.

Articles