Ruby fork多个进程并跟踪运行/完成的状态?

时间:2016-03-02 05:48:38

标签: ruby fork

我正在尝试关闭子进程,并跟踪进程是否仍在运行或已完成,但我不想阻止并等待进程完成,因为我需要能够继续监视对于新的传入请求,并根据需要分叉其他子进程。

以下是我正在尝试做的一些基本示例代码。

loop do
  pid = fork do
    puts 'foo'
    exit 99
  end

  ret_pid = wait2(pid,  Process::WNOHANG) # Tried this, but it never gets a value
  if ret_pid
    puts 'got a returned pid'
  end
end

我已经尝试使用Process::WNOHANG标志等待;这不会阻止,但它似乎永远不会获得任何类型的返回状态。我已经尝试了waitwait2,但没有区别。

我也试过等待使用wait(pid)从子进程获取状态,但这会阻塞所以我最终只得到一个分叉的进程,这对我没有任何帮助。

1 个答案:

答案 0 :(得分:0)

我不知道对你来说什么更重要,是否"检查子过程状态"或者能够根据需要分叉额外的子进程"。如果后者比这更有帮助:

Foo[Any,Any,Any]

您可以继续将新元素推送到队列中,或者如果您的目标是永久循环,那么您可以轻松地将其从Foo[Any,Any,_ >: Int with String]更改为 queue = ['A','B','C','D'] forks = [] while queue.size > 0 q = queue.shift forks << Process.fork do puts q end if forks.size >= 10 forks.delete Process.wait end end

使用while,您可以同时设置正在处理的子进程数量

了解loop的重要一点是,当您不向其传递参数时,它会等待任何子进程完成并返回该进程的pid。