我需要啓動許多短暫的流程以啓動某種spawner
流程,這些流程由自己做一些工作,保存結果(或委託保存到某個保存流程)然後退出。許多短生命過程與全球流程計數器
而且還應該有一些並行運行進程的全侷限制。我猜想某種隊列,因爲當達到限制時,spawner
可能會繼續產生新的進程,而他們我認爲應該暫停並等待房間運行。
這個方案能否在erlang中輕鬆實現?讓工人羣體獲得一定的速度或者每次都能產生新的過程是否合適?主管simple_one_for_one能幫忙嗎?
我需要啓動許多短暫的流程以啓動某種spawner
流程,這些流程由自己做一些工作,保存結果(或委託保存到某個保存流程)然後退出。許多短生命過程與全球流程計數器
而且還應該有一些並行運行進程的全侷限制。我猜想某種隊列,因爲當達到限制時,spawner
可能會繼續產生新的進程,而他們我認爲應該暫停並等待房間運行。
這個方案能否在erlang中輕鬆實現?讓工人羣體獲得一定的速度或者每次都能產生新的過程是否合適?主管simple_one_for_one能幫忙嗎?
您可以輕鬆地產卵過程中,已經指出的那樣,你的產卵過程中可以使用顯示器/ 2和反限制和維護工作進程池。您的產卵過程會產生一組初始的過程,監控生成的Pid(即monitor(process,Pid))並適當減少計數器。然後它將進入接收,等待{'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.
你可以很容易地創建/產卵流程,不做任何接收,與此類似:
spawn(fun() -> io:format("Do something and exit~n") end).
而不是印刷的,你可以只委託或東西。不知道是否爲這樣的事情創建一個池有任何意義,除非這些進程是永久運行的,只是發送將被委託給其他實體的消息。
HTH