我的主要功能是内部有一个基本循环。我想为循环的每次迭代启动一个子进程(在执行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请求,整个过程就停止了。
答案 0 :(得分:0)
子进程必须调用exit
或exit!
才能停止执行:
data.each do |k, v|
if pid = fork
Process.detach(pid)
doHttpQuery(v + ":" + "k")
exit
end
end
exit
和exit!
之间的区别是
exit
运行at_exit
函数。其默认退出代码为0。exit!
未运行at_exit
函数。其默认退出代码为1。