новости сообщество форум вики
Erlang по-русски. Форум » Erlang »

Параллельность и handle_cast

(9 posts)

  1. Все вермя задаюсь вопросом.

    Запускается одновременно два handle_cast.
    ? они выполняются разное количесво времени а на выходе разные состояния(State) и если я не знаю какой выполнится быстрее, то после выполнения могу получить непредсказуемый результат в переменной State.

    Товарищи профессионалы, расскажите пожалуйста. Как ре?ается эта проблема или это вовсе не проблема? ?ли существует очередь обработки.

    Заранее спасибо.

    Отправлено 1 год назад #
  2. Два cast-а будут выполняться поочереди, не одновременно.

    Отправлено 1 год назад #
  3. EvilBlueBeaver
    Участник

    От себя могу добавить, что очередь у cast'ов и call'ов общая. Потому при боль?ом числе cast'ов есть риск нарваться на то, что call'ы будут отваливаться по тайм-ауту.

    Для себя на?ел ре?ение в разделении одного gen_server'а на 2 с общим супервизором. Не знаю насколько это правильно, но так по крайней мере работает.

    Отправлено 1 год назад #
  4. Спасибо за комментарии.

    Появилась идея.
    Если я в Handle_call вызову handle_cast того же сервера. То handle_cast выполнится только после того как закончится выполнения handle_call.

    Правильно?
    Если правильно, то этом можно использовать!
    отложеннаое выполнение функции

    Отправлено 1 год назад #
  5. EvilBlueBeaver
    Участник

    Если я в Handle_call вызову handle_cast того же сервера. То handle_cast выполнится только после того как закончится выполнения handle_call.

    Ну чисто по логике мне кажется, что так и будет, но только вопрос, зачем оно нужно? не проще сделать timer:apply_after, если функцию нужно выполнить через некоторое время.

    По той же логике если вызвать call внутри handle_call, то все должно отвалиться по таймауту или зависнуть, если таймаута нет :)

    Отправлено 1 год назад #
  6. gen_server это очень простая вещь, это всего ли?ь процесс который сидит в receive и принимает запросы, call, cast, ну и просто сообщения, а затем вызывает для них соответственно handle_call, handle_cast и handle_info, поэтому пока выполняется один из обработчиков остальные сообщения ждут своей очереди в mailbox-е. Т.е. если в handle_call вызвать handle_cast то cast обработается после завер?ения handle_call, все верно.

    Отправлено 1 год назад #
  7. EvilBlueBeaver
    Участник

    gen_server это очень простая вещь, это всего ли?ь процесс который сидит в receive и принимает запросы, call, cast, ну и просто сообщения, а затем вызывает для них соответственно handle_call, handle_cast и handle_info, поэтому пока выполняется один из обработчиков остальные сообщения ждут своей очереди в mailbox-е. Т.е. если в handle_call вызвать handle_cast то cast обработается после завер?ения handle_call, все верно.

    cast обработается после завер?ения текущего handle_call, а также после завер?ения обработки всех сообщений, которые находятся в очереди после текущего., до того, как был послан cast

    Все-таки мне не совсем очевиден такой способ применения gen_server'a.

    Отправлено 1 год назад #
  8. Вызов cast удобно использовать внутри init этого же сервера. Для выполнения какой-то дополнительной длительной инициализации, подключения куда-то и т.п. Фи?ка в том, что это будет гарантированно первое сообщение в очереди ген-сервера. Аналогично и с gen_fsm.

    Полезны такие вызовы, когда надо быстро завер?ить init, т.е. вернуть наружу pid нового процесса, а потом производить длительную асинхронную инициализацию.

    Отправлено 1 год назад #
  9. EvilBlueBeaver
    Участник

    Вот это уже интересно. ?дея хоро?ая и мысль здравая.

    Отправлено 1 год назад #

RSS экспорт этой темы

Отправить сообщение

Вы должны войти в систему, чтобы оставлять сообщения.

 
 

так же

Популярные тэги



Currently online

No Members around.

сообщество

http://groups.google.com/group/erlang-russian/feed/rss_v2_0_msgs.xml