1

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

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

ответ

4

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

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). 
+0

Большое спасибо за помощь! И я понял, что сформулировал это в обратном направлении; мои вспомогательные функции держали меня в бесконечном цикле, и я пытался генераторы списков без толка ... фрагмента кода, который у меня есть, что он замерзает прямо сейчас выглядит следующим образом: \t \t \t \t \t \t \t \t сообщение = {Я(), продолжить}, \t \t \t \t \t \t \t \t Io: формат ("получил здесь 1"), \t \t \t \t \t \t \t \t [X! Сообщение || X <- Pids], io: формат («получил здесь 2»); Замерзание между 1 и 2 ... Думаю, это означает, что это проблема с процессами, с которыми я общаюсь. Спасибо еще раз за помощь! – JBarnett

+2

@JBarnett Я не могу вам помочь. Вы показали мне короткий фрагмент кода, и я не могу понять, почему он не работает. Здесь невозможно замерзнуть, поскольку он просто отправляет сообщения. Если ваш код короток, внесите изменения в свой вопрос. EDIT: Есть ли ошибка? Если Pids не является списком или X не является pid, тогда это должно произойти сбой ... вы каким-то образом отслеживаете эти процессы? Если вы знаете его pid, попробуйте is_process_alive (ItsPid). –