我在我的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上不能正常工作吗?我担心这可能会导致分离的收割者线程和等待的父进程之间的竞争状态,关于谁首先收集子状态。