0

我的主要功能是里面有一个基本的循环。我想为循环的每次迭代触发一个子进程(它会执行 HTTP 请求,稍后会详细介绍)。

如果我使用进程,我的问题是看起来每个子进程都在继续执行主线程,而我只希望主进程在循环之后继续,而子进程在 HTTP req 完成后死亡。主进程没有兴趣让每个子进程完成后再继续。

现在看起来像这样:

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 请求,整个过程就停止了。

4

1 回答 1

0

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

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。
于 2020-09-13T04:26:42.843 回答