你如何在Ruby中生成子进程?

时间:2008-11-20 22:19:37

标签: ruby

我想将主进程中的一段代码卸载到子进程以使其同时运行。我还希望得到生成子进程的PID,以便在必要时监视并终止它。

5 个答案:

答案 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

与较低级别的方法相比,他们完成了大部分艰苦的工作,使其更容易,更有效,更灵活。