Уведомить и остановить менеджер 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) или приказав закрыть его своему собственному руководителю.

Другие вопросы по тегам