下面的代码:
-module(a).
-compile(export_all).
say(2,0) ->
[1,2];
say(A,B) ->
say(A-1,B-1).
loop(0) ->
io:format("");
loop(Times) ->
L = spawn(a, say, [4,2]),
io:fwrite( "L is ~w ~n", [L] ),
loop(Times-1).
run() ->
loop(4).
我希望每次函数'say'完成时都有一个L中的list [1,2],但是,由于使用了spawn,返回的是进程的pid而不是函数的list,所以我得到了以下输出:
L is <0.113.0>
L is <0.114.0>
L is <0.115.0>
L is <0.116.0>
我想要的是
L is [1,2]
L is [1,2]
L is [1,2]
L is [1,2]
我怎样才能做到这一点?
2条答案
按热度按时间ffscu2ro1#
要在进程之间传递信息,可以使用
!
向另一个进程的邮箱发送消息,然后使用receive clause
从进程邮箱提取消息。在 shell 中:
或者,您可以派生所有进程,然后在它们进来时读取结果:
要确保您只接收来自您所生成的进程的
receive
消息,可以执行以下操作:使用这样的
receive
时存在一些风险:如果一个工作进程在发送消息到你的主进程之前崩溃了,那么你的主进程在等待来自崩溃进程的消息时将无限期地停留在接收状态。2一个解决方案是:在接收中使用超时。另一个:使用spawn_monitor()函数。wfsdck302#
您需要为此使用消息(或信号),因为代码在单独的进程中运行。
在这种情况下,我喜欢使用spawn_monitor:
请记住,您可以同时对多条消息执行
receive
,也可以按顺序接收它们(将无序的消息留在邮箱中),因此您可以生成多个线程,等待所有线程完成,收集结果: