我正在我的Rails服务器(运行在Linux上)中重构一些并发处理,以使用派生。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)然而,Rubyhttp://www.ruby-doc.org/core/classes/Process.html文档说您不应该这样做:http://www.ruby-doc.org/core/classes/Process.html
某些操作系统保留终止子进程的状态,直到父进程收集该状态(通常使用wait()的某种变体)。如果父进程从未收集此状态,则子进程将作为僵尸进程继续存在。Process::detach通过设置一个单独的Ruby线程来防止这种情况,该线程的唯一任务是在进程pid终止时获取进程pid的状态。只有当您不打算显式地等待子节点终止时,才使用.。
然而,Spawn::wait实际上允许您通过包装Process::wait来做到这一点。另外,我特别希望使用Process::waitpid2方法来等待子进程,而不是使用Spawn::wait方法。
分离和等待在Linux上不能正常工作吗?我担心这可能会导致分离的收割线程与等待的父进程之间的争用条件,比如谁首先收集子状态。
发布于 2012-06-21 22:00:47
这个问题的答案在文件中。您是否正在编写代码以供自己在受控环境中使用?还是被第三方广泛使用?Ruby是为了被第三方广泛使用而编写的,所以他们的建议是不要在“某些操作系统”上做一些可能会失败的事情。也许产卵库主要是为在Linux机器上使用而设计的,并且只在这种策略起作用的一小部分上进行测试。
如果您正在分发所编写的代码以供任何人和每个人使用,我将采用Ruby的方法。
如果您控制运行此代码的环境,我将编写两个测试:
计算两者的失败率,如果两者相等(在你认为可以接受的范围内),那就去做吧!
https://stackoverflow.com/questions/7591140
复制相似问题