我想将主进程中的一段代码卸载到子进程以使其同时运行。我还希望得到生成子进程的PID,以便在必要时监视并终止它。
答案 0 :(得分:41)
除了克里斯的好回答之外,请记得从你的主人那里打电话给Process.wait
以获得你的孩子过程,否则你会留下僵尸。
评论中要求的示例:
pid = Process.fork do
puts "child, pid #{Process.pid} sleeping..."
sleep 5
puts "child exiting"
end
puts "parent, pid #{Process.pid}, waiting on child pid #{pid}"
Process.wait
puts "parent exiting"
答案 1 :(得分:24)
您可以使用fork
内核方法。这是一个例子:
#!/usr/bin/env ruby
puts "This is the master process."
child_pid = fork do
puts "This is the child process"
exit
end
puts "The PID of the child process is #{child_pid}"
fork
方法返回它所分叉的进程的PID,并执行传递的块中的任何代码。与常规Ruby块一样,它保留了父进程的绑定。
最好制作分叉流程exit
。
答案 2 :(得分:7)
在1.9中,您可以使用Process.spawn命令。 另请参阅http://en.wikibooks.org/wiki/Ruby_Programming/Running_Multiple_Processes
答案 3 :(得分:2)
如果你乐意使用Threads而不是Processes,那么这样的东西可能可以扩展到多于一个分叉:
def doit(x)
sleep(rand(10))
puts "Done... #{x}"
end
thingstodo = ["a","b","c","d","e","f","g"]
tasklist = []
# Set the threads going
thingstodo.each { |thing|
task = Thread.new(thing) { |this| doit(this) }
tasklist << task
}
# Wait for the threads to finish
tasklist.each { |task|
task.join
}
请参阅John Topley关于Ruby执行模型及其限制的优秀评论和参考。
刚编辑以纠正一个明显的错误(没有任务分配),并遵循@(Jason King)的建议。
答案 4 :(得分:2)
fork / exec / spawn的一个很好的替代品是Ruby 1.9的posix-spawn gem:https://github.com/rtomayko/posix-spawn
与较低级别的方法相比,他们完成了大部分艰苦的工作,使其更容易,更有效,更灵活。