Подходит ли словарь процессов в этом случае?

Я прочитал несколько комментариев здесь и в других местах, в которых говорилось, что словарь процессов Erlang был плохой идеей и должен умереть. Обычно, как новичок в Erlang, я бы просто избегал этого. Однако в этой ситуации мои другие варианты не очень хороши.

У меня есть основная функция диспетчера, которая выглядит примерно так:

dispatch(State) ->
    receive
        {cmd1, Params} ->
            NewState = do_cmd1_stuff(Params, State),
            dispatch(NewState);
        {cmd2, Params} ->
            NewState = do_cmd2_stuff(Params, State),
            dispatch(NewState);
        BadMsg ->
            log_error(BadMsg),
            dispatch(State)
    end.

Очевидно, мои имена более значимы для меня, но в этом суть. Глубоко внутри функции, вызываемой функцией, вызываемой функцией do_cmd2_stuff (), я хочу разослать всем своим пользователям сообщения о том, что я сделал. Для этого мне нужно получить список пользователей с того места, где я отправляю сообщения. Список пользователей нелегко закрепить в глобальном состоянии, поскольку это всего лишь одна структура данных, представляющая единственный блок данных, с которым я работаю.

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

В качестве альтернативы я мог бы заставить все функции do_cmdN_stuff () возвращать сообщение для отправки. Это тоже не очень хорошо, поскольку отправка сообщения - не последнее, что я хочу делать, и это загромождает мой диспетчер кучей {Msg, NewState} кортежей. Более того, некоторые функции могут иногда не иметь сообщений для отправки.

Как я уже сказал ранее, я новичок в Erlang. Может быть, кто-нибудь с большим опытом подскажет мне лучший путь. Есть один? Подходит ли в этом случае словарь процесса?

7
задан nmichaels 1 November 2010 в 22:37
поделиться