Ruby进程分叉/线程 - 子进程生命周期

时间:2013-05-10 09:07:26

标签: ruby multithreading process fork

我的主要功能是内部有一个基本循环。我想为循环的每次迭代启动一个子进程(在执行HTTP请求时会发生这种情况,稍后会详细介绍)。

如果我正在使用进程,我的问题是看起来每个子进程继续执行主线程,而我只希望主进程在循环之后继续,并且子进程在HTTP请求之后死掉完了。在继续之前,主要过程对每个孩子都不感兴趣。

现在看起来像这样:

data.each do |k, v|
  (pid = fork) ? Process.detach(pid) : doHttpQuery(v + ":" + "k")
end
# code after this comment should only get executed once

此外,当流程结束时,我得到了这个

thread.rb:189:in `sleep': deadlock detected (fatal)

如果我使用这样的线程

threads << Thread.new { doHttpQuery(v + ":" + "k")}

然后

threads.each { |thr| thr.join }

线程被触发,但由于某种原因,它实际上并没有执行HTTP请求,整个过程就停止了。

1 个答案:

答案 0 :(得分:0)

子进程必须调用exitexit!才能停止执行:

data.each do |k, v|
  if pid = fork
    Process.detach(pid)
    doHttpQuery(v + ":" + "k")
    exit
  end
end

exitexit!之间的区别是

  • exit运行at_exit函数。其默认退出代码为0。
  • exit!未运行at_exit函数。其默认退出代码为1。