4

我正在重构我的 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)

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

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

然而,Spawn::wait有效地允许您通过包装来做到这一点Process::wait。附带说明一下,我特别想使用该Process::waitpid2方法等待子进程,而不是使用该Spawn::wait方法。

分离并等待在 Linux 上不能正常工作吗?我担心这可能会导致分离的收割线程和等待的父进程之间出现竞争条件,即谁先收集子状态。

4

1 回答 1

0

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

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

如果您控制运行此代码的环境,我将编写两个测试:

  1. 产生一个进程,分离它然后等待它的测试。
  2. 产生一个进程然后等待它的测试。

计算两者的失败率,如果它们相等(在您认为可以接受的范围内),那就去吧!

于 2012-06-21T22:00:47.950 回答