2016-03-02 49 views
0

我試圖將子進程分叉並跟蹤進程是否仍在運行或已完成,但我不想阻止並等待進程完成,因爲我需要能夠繼續進行監視新的傳入請求並根據需要分離額外的子進程。紅寶石叉多個進程和跟蹤狀態的運行/完成?

這是我正在嘗試做的一些基本示例代碼。

loop do 
    pid = fork do 
    puts 'foo' 
    exit 99 
    end 

    ret_pid = wait2(pid, Process::WNOHANG) # Tried this, but it never gets a value 
    if ret_pid 
    puts 'got a returned pid' 
    end 
end 

我試着使用Process::WNOHANG標誌等;這不會阻止,但它似乎從來沒有得到任何類型的返回狀態。我試過waitwait2,但沒有區別。

我也試過等待,只是使用wait(pid),它從子進程獲取狀態,但是這會阻塞,所以最終只有一個分支進程對我沒有任何好處。

回答

0

我不知道什麼對你來說更重要,它是「檢查子進程狀態」還是能夠「根據需要分離出額外的子進程」。如果高於這個後者可以幫助你:

queue = ['A','B','C','D'] 
    forks = [] 
    while queue.size > 0 
    q = queue.shift 
    forks << Process.fork do 
     puts q 
    end 

    if forks.size >= 10 
     forks.delete Process.wait 
    end 
    end 

您可以繼續推動新的元素排隊,或者如果你的目標是永遠循環下去,那麼你可以很容易地循環改變它從whileloop

隨着子進程同時被處理的forks.size可以設定量

重要的是要了解Process.wait是,當你不參數傳遞給它,它會等待所有的子進程完成並返回該進程的pid。