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