2011-09-29 73 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. 生成一个进程然后等待它的测试。

计数的失败率均为如果他们是平等的(你觉得是可以接受的余量范围内),去了!