2012-01-03 32 views
0

我需要啓動許多短暫的流程以啓動某種spawner流程,這些流程由自己做一些工作,保存結果(或委託保存到某個保存流程)然後退出。許多短生命過程與全球流程計數器

而且還應該有一些並行運行進程的全侷限制。我猜想某種隊列,因爲當達到限制時,spawner可能會繼續產生新的進程,而他們我認爲應該暫停並等待房間運行。

這個方案能否在erlang中輕鬆實現?讓工人羣體獲得一定的速度或者每次都能產生新的過程是否合適?主管simple_one_for_one能幫忙嗎?

回答

1

您可以輕鬆地產卵過程中,已經指出的那樣,你的產卵過程中可以使用顯示器/ 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. 
1

你可以很容易地創建/產卵流程,不做任何接收,與此類似:

spawn(fun() -> io:format("Do something and exit~n") end). 

而不是印刷的,你可以只委託或東西。不知道是否爲這樣的事情創建一個池有任何意義,除非這些進程是永久運行的,只是發送將被委託給其他實體的消息。

HTH