我正在尝试关闭子进程,并跟踪进程是否仍在运行或已完成,但我不想阻止并等待进程完成,因为我需要能够继续监视对于新的传入请求,并根据需要分叉其他子进程。
以下是我正在尝试做的一些基本示例代码。
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
标志等待;这不会阻止,但它似乎永远不会获得任何类型的返回状态。我已经尝试了wait
和wait2
,但没有区别。
我也试过等待使用wait(pid)
从子进程获取状态,但这会阻塞所以我最终只得到一个分叉的进程,这对我没有任何帮助。
答案 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。