Process :: detach和Process ::等互斥(Ruby)吗?

时间:2011-09-29 00:20:08

标签: ruby ruby-on-rails-plugins spawn

我在Ruby on Rails服务器(在Linux上运行)中重构一些并发处理以使用Spawn。 Spawn::fork_it文档声称分离的进程在分离后仍然可以等待:https://github.com/tra/spawn/blob/master/lib/spawn.rb(第186行):

# detach from child process (parent may still wait for detached process if they wish)
Process.detach(child)

但是,Ruby Process::detach文档说你不应该这样做:http://www.ruby-doc.org/core/classes/Process.html

  

某些操作系统会保留已终止子进程的状态,直到父进程收集该状态(通常使用wait()的某些变体。如果父进程从未收集此状态,则子进程将作为僵尸进程保留。进程::分离通过设置一个单独的Ruby线程来防止这种情况,该线程的唯一工作是在进程终止时获取进程pid的状态。仅当您不打算明确等待子进程终止时才使用detach。 < / p>

然而Spawn::wait有效地允许您通过包裹Process::wait来做到这一点。另外,我特别想使用Process::waitpid2方法等待子进程,而不是使用Spawn::wait方法。

分离 - 等待在Linux上无法正常工作吗?我担心这可能会导致分离的收割者线程和等待的父进程之间的竞争状况,以及谁先收集子状态。

1 个答案:

答案 0 :(得分:0)

这个问题的答案在文档中。您是否在受控环境中编写自己使用的代码?或者被第三方广泛使用?编写Ruby以供第三方广泛使用,因此他们的建议是不要在“某些操作系统”上做一些失败的事情。也许Spawn库主要是为在Linux机器上使用而设计的,并且只在这个策略有效的小部分上进行测试。

如果您正在分发您正在编写的代码供任何人和所有人使用,我会采用Ruby的方法。

如果你控制运行这段代码的环境,我会写两个测试:

  1. 产生进程的测试,将其分离然后等待它。
  2. 产生进程然后等待它的测试。
  3. 计算两者的失败率,如果它们相等(在您觉得可以接受的范围内),那就去吧!