我需要启动许多短暂的进程,由某种spawner
进程启动,这些进程自己做一些工作,保存结果(或委托保存到某些保护程序)然后退出。 / p>
并行运行进程的数量也应该有一些全局限制。我想某种队列,因为当达到限制时,spawner
可以继续产生新进程,而我猜他们应该暂停并等待房间运行。
该方案是否可以在erlang中轻松实现?让工人群体获得一定的速度或者每次都可以产生新的过程是否合理?主管simple_one_for_one可以帮忙吗?
答案 0 :(得分:1)
您可以非常轻松地创建/生成无法接收的流程,类似于:
spawn(fun() -> io:format("Do something and exit~n") end).
而不是那种印刷,你可以只是委托或其他东西。不确定是否为这样的事情创建一个有任何意义的池,除非这些进程永远运行并且只是向它们发送将被委托给其他实体的消息。
HTH
答案 1 :(得分:1)
如前所述,您可以轻松地生成进程,并且您的生成进程可以使用monitor / 2和计数器来限制和维护您的工作进程池。您的产生过程将产生一组初始进程,监视生成的Pids(即监视器(进程,Pid))并根据需要递减计数器。然后它将进入 receive ,等待{'DOWN',MonitorRef,Type,Object,Info}消息,指示工作人员已终止。如... ...
loop(MaxProcesses, LiveProcesses) ->
receive
{'DOWN', _Ref, process, _Pid, _Info} ->
case LiveProcesses of
N when N =< MaxProcesses ->
spawn_another() %and monitor new pid
loop(MaxProcess, LiveProcesses);
N when N > MaxProcess ->
loop(MaxProcesses, LiveProcesses -1)
end
end
after %optional if you want the spawner to potentially do something else
Timeout->
do more work
loop(MaxProcesses, LiveProcesses)
end
end.