2011-09-29 70 views
4

我在我的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上不能正常工作嗎?我擔心這可能會導致分離的收割者線程和等待的父進程之間的競爭狀態,關於誰首先收集子狀態。

回答

0

此問題的答案在文檔中。您是否在受控環境下編寫自己的代碼?還是要被第三方廣泛使用? Ruby被寫入被第三方廣泛使用,所以他們的建議是不要在「某些操作系統」上做某些事情。 Spawn庫可能主要用於Linux機器上,並且只能在這個策略工作的一小部分上進行測試。

如果你發佈你寫被任何人,每個人都可以使用的代碼,我會採取Ruby的方法。

如果控制在何處這個代碼將要運行的環境,我會寫兩個測試:

  1. 一個生成過程,分離,然後等待它的測試。
  2. 生成一個進程然後等待它的測試。

計數的失敗率均爲如果他們是平等的(你覺得是可以接受的餘量範圍內),去了!