在Erlang中创建跨多个进程的列表

时间:2013-11-06 21:47:49

标签: erlang

好的,我甚至很难想到如何描述我需要的东西。但它真的很简单。我想生成n个生成n个ID的进程。我有一些简单的递归和打印到终端。我正在努力创建一个列表,可以访问每个生成的进程,我可以在其中累积id。然后,当进程完成时,我需要打印出任何重复的内容。

我尝试了一些与ets表不同的选项,它总是打印一个没有列表的列表。我推测是因为我在流程完成之前就开始了打印功能?我知道我在想这个错误,但我会非常感谢在正确的方向上轻推。

1 个答案:

答案 0 :(得分:1)

您需要将主进程与生成的进程同步。您可以通过从每个id生成器进程向main发送消息来实现,后者将等待所有进程报告。

master(N) ->
   %% we need a pid of this process for the slaves to send messages to
   Self = self(),

   %% spawn slave processes and save their pids
   Pids = [spawn(fun() -> slave(Self) end || lists:seq(1, N)],

   %% receive id message from each of the slave processes
   Ids = [recv_id(Pid) || Pid <- Pids],

   %% do whatever we want with the data here
   find_duplicates(Ids).

slave(Master) ->
   Id = mk_id(),

   %% send a message to the master
   Master ! {id, self(), Id}.

recv_id(Pid) ->
   receive
      {id, Pid, Id} -> Id
   end.

mk_id() -> ...
find_duplicates(Ids) -> ...