Ruby进程分叉/线程-子进程生命周期
我在主函数中添加了一个基本循环。我想为循环的每一次迭代启动一个子进程(在执行HTTP请求时启动,稍后将详细介绍) 如果我使用进程,我的问题是看起来每个子进程都会继续执行主线程,而我只希望主进程在循环后继续,子进程在HTTP req完成后死亡。主进程对继续之前要完成的每个子进程不感兴趣 现在看起来像这样: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
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