以下是我试图从一个名为best的方法产生3个进程的程序。我希望收到来自所有进程的响应,并将它们存储在元组中,但我只能得到一个响应。
test() ->
receive
{From,N} -> From!{self(),N},
loop()
end.
best(N) ->
Aid=spawn(fun t:loop/0),
Aid ! {self(),N},
Bid=spawn(fun t:loop/0),
Bid ! {self(),N},
Cid=spawn(fun t:loop/0),
Cid ! {self(),N},
receive
{Pid,Response} ->{Response}
end.
有人可以帮我解决这个问题吗
答案 0 :(得分:1)
收到一条消息后,在最佳/ 2功能出口处收到您的接收块。如果在shell中启动此代码,则可以使用函数flush()验证其他消息是否仍在消息队列中。 (你发布的代码缺少t:loop / 0函数,我想它会根据N计算一些东西并通过消息将答案返回给spawner)
为了能够接收多条消息,您必须将接收块放入"循环"递归地调用自己直到得到所有答案。您将不得不使用一个允许递归循环知道何时完成的变量(预期的答案数,应该回答的进程列表......),并在列表变量中收集答案。
答案 1 :(得分:1)
-module(wy).
-compile(export_all).
loop() ->
Self = self(),
receive
{From, Ref, N} ->
From ! {Self, Ref, N * N}
end.
receive_result(Ref) ->
receive
{Pid, Ref, R} ->
io:format("process ~p: ~p~n", [Pid, R]),
receive_result(Ref)
after 10 ->
ok
end.
best() ->
APid = spawn(fun loop/0),
BPid = spawn(fun loop/0),
CPid = spawn(fun loop/0),
Self = self(),
Ref = make_ref(),
APid ! {Self, Ref, 2},
BPid ! {Self, Ref, 3},
CPid ! {Self, Ref, 4},
receive_result(Ref).
您可以按照这个小代码。结果是:
9> wy:best().
process <0.77.0>: 4
process <0.78.0>: 9
process <0.79.0>: 16
ok