В Erlang передача сообщения всем элементам списка pids

Я пытаюсь создать очень простой сервер барьерной синхронизации, где сервер изначально получает несколько процессов, которые будут с ним общаться. Когда процесс завершен, он получает сообщение с идентификатором этого процесса и хранит список всех процессов, которые должны это сделать. Когда барьер достигает нуля (все процессы отправили сообщения), мой сервер должен отправить сообщение каждому из них (я использую [Pid | ProcList] в качестве списка pids).

Я пытался использовать вспомогательную функцию безрезультатно, понимание списка держит меня в бесконечном цикле, и поэтому я изучаю, как использовать lists: foreach, чтобы позаботиться об этом. Я новичок в функциональном программировании, но, насколько я понимаю, этот foreach должен принимать список, а также функцию лямбда-исчисления для отправки сообщения каждому узлу в списке. Из-за инфиксной природы "!" мне еще предстоит найти способ сделать это, не вызывая синтаксических ошибок.


person JBarnett    schedule 23.03.2015    source источник


Ответы (1)


Как вы сделали бесконечный цикл в понимании списка? Должен сказать, это довольно сложно. Попробуй это:

Message = % broadcast message goes here
ListOfPids = % list of recipients
[Pid ! Message || Pid <- ListOfPids].

Если вы хотите использовать foreach, то он принимает функцию с одним аргументом в качестве первого аргумента, поэтому сначала необходимо обернуть send, так как это функция с двумя аргументами.

Message =  % broadcast message goes here
ListOfPids = % list of recipients
Fun = fun (Pid) -> Pid ! Message end,
lists:foreach(Fun, ListOfPids).
person Łukasz Ptaszyński    schedule 23.03.2015
comment
Огромное спасибо за помощь! И я понял, что сформулировал это наоборот; мои вспомогательные функции держали меня в бесконечном цикле, и я безрезультатно пытался понять список... Фрагмент кода, который у меня есть, который сейчас зависает, выглядит следующим образом: Message = {self(),continue}, io :format(получил здесь 1), [X ! Сообщение || X ‹- Pids], io:format(здесь 2); Зависание между 1 и 2... Я думаю, это означает, что это проблема с процессами, с которыми я общаюсь. Спасибо еще раз за помощь! - person JBarnett; 23.03.2015
comment
@JBarnett, я не могу тебе помочь. Вы показали мне лишь короткий фрагмент своего кода, и я не могу понять, почему он не работает. Здесь невозможно заморозиться, так как это просто отправка сообщений. Если ваш код короткий, отредактируйте свой вопрос. РЕДАКТИРОВАТЬ: Есть ли ошибка? Если Pids не является списком или X не является pid, тогда это должно привести к сбою ... вы как-то отслеживаете эти процессы? Если вы знаете его pid, попробуйте is_process_alive(ItsPid). - person Łukasz Ptaszyński; 23.03.2015