Уведомить и остановить менеджер gen_event атомарно
Когда конкретное сообщение получено моим gen_event
Процесс менеджера, я хочу, чтобы он остановился после того, как все обработчики обработали его, и до того, как они получат и обработают любые другие события. Единственный способ найти это:
-module(manager).
...
stop(Reason) ->
gen_event:sync_notify(manager, {stop, Reason}),
gen_event:stop(manager).
Но это требует, чтобы все обработчики возвращались remove_handler
от handle_event({stop, Reason}, State)
в противном случае они могут обработать событие, отправленное из другого процесса после sync_notify
и раньше stop
, Я предпочел бы иметь подход, который не предъявляет никаких требований к обработчикам.
1 ответ
Насколько я знаю, нет другого способа сделать это, чем тот, который вы используете для обработки способом, который действительно ограничен одним вызовом, кроме простого убийства менеджера событий с помощью exit(Pid, Reason)
или приказав закрыть его своему собственному руководителю.