等待所有子进程在Ruby中完成的最佳方法是什么?

时间:2017-08-17 08:05:28

标签: ruby child-process

正在寻找一种等待所有子进程完成的方法,我找到了这段代码:

while true
    p "waiting for child processes"
    begin
        exited_pid = Process.waitpid(-1,Process::WNOHANG)
        if exited_pid and exited_pid > 0 then
            p "Process exited : #{exited_pid} with status #{$?.exitstatus }"
        end
        sleep 5
    rescue SystemCallError
        puts "All children collected!"
        break
    end
end

这看起来像Unix系统进程管理一样,就像我在tutorialspoint HERE上读到的那样。

总而言之,它看起来像这段代码:

  1. 针对存在的任何子进程调用Process.waitpid。如果没有退出子进程,请继续。
  2. 如果子进程已退出,则通知用户。否则睡觉,然后再次检查。
  3. 当所有子进程都退出时,将抛出一个错误,该错误被捕获并通知用户进程已完成。
  4. 但是在C(Make parent wait for all child processes)中查看等待子进程的类似问题,其中有一个答案:

      

    POSIX定义了一个函数:wait(NULL);.它是waitpid的简写(-1,   NULL,0);,它将阻塞,直到所有子进程退出。

    我测试过Ruby中的Process.wait()与上面的详细代码完全相同。

    上面更详细的代码有什么好处?或者,这被认为是等待子进程的更好方法?在冗长的代码中,我似乎可以等待特定进程并侦听特定的退出代码。但如果我不需要这样做有什么好处吗?

    另外,关于更详细的代码:

    1. 如果没有更多子进程,为什么对Process.waitpid()的调用会抛出错误?
    2. 如果在5秒休眠期内存在多于1个子进程,则似乎存在已完成进程的队列,而Process.waitpid只返回队列的顶级成员。这里到底发生了什么?

0 个答案:

没有答案