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

Ruby进程分叉/线程-子进程生命周期,ruby,multithreading,process,fork,Ruby,Multithreading,Process,Fork,我在主函数中添加了一个基本循环。我想为循环的每一次迭代启动一个子进程(在执行HTTP请求时启动,稍后将详细介绍) 如果我使用进程,我的问题是看起来每个子进程都会继续执行主线程,而我只希望主进程在循环后继续,子进程在HTTP req完成后死亡。主进程对继续之前要完成的每个子进程不感兴趣 现在看起来像这样: data.each do |k, v| (pid = fork) ? Process.detach(pid) : doHttpQuery(v + ":" + "k") end # code

我在主函数中添加了一个基本循环。我想为循环的每一次迭代启动一个子进程(在执行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")}

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

子进程必须调用
exit
exit要停止执行,请执行以下操作:

data.each do |k, v|
  if pid = fork
    Process.detach(pid)
    doHttpQuery(v + ":" + "k")
    exit
  end
end
退出
退出之间的区别

  • exit
    在退出时运行
    功能。其默认退出代码为0
  • 退出在退出时不运行
    功能。其默认退出代码为1

在线程版本中,调用的是
doHttpQuery
吗?我对代码进行了一些重构,是的,调用了HTTP查询(通过httpartygem)。它似乎要停止,但实际上它正在等待所有HTTP调用完成,所以这正好说明线程是多么“绿色”。仍然有分叉的问题吗
data.each do |k, v|
  if pid = fork
    Process.detach(pid)
    doHttpQuery(v + ":" + "k")
    exit
  end
end