我在我的Ruby on Rails服務器(運行在Linux上)中重構了一些併發處理以使用Spawn。那分叉過程Spawn::fork_it
文檔索賠仍然可以取出來之後被伺候:https://github.com/tra/spawn/blob/master/lib/spawn.rb(行186):Process :: detach和Process :: wait互斥(Ruby)?
# detach from child process (parent may still wait for detached process if they wish)
Process.detach(child)
然而,紅寶石Process::detach
文件說,你不應該這樣做:http://www.ruby-doc.org/core/classes/Process.html
一些操作系統會保留已終止的子進程的狀態,直到父進程收集該狀態爲止(通常使用wait()的一些變體,如果父從未收集到該狀態,則該子進程將保持殭屍進程狀態,Process :: detach通過設置一個單獨的Ruby線程,它的唯一工作就是收穫進程pid在終止時的狀態。 僅當您不打算明確等待孩子終止時使用分離。
然而Spawn::wait
有效地讓你只要做的是通過包裝Process::wait
。在附註中,我特別想使用Process::waitpid2
方法來等待子進程,而不是使用Spawn::wait
方法。
分離和等待在Linux上不能正常工作嗎?我擔心這可能會導致分離的收割者線程和等待的父進程之間的競爭狀態,關於誰首先收集子狀態。