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

Chr*_*oyd 37 ruby

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

Mar*_*ter 44

除了克里斯的好回答,记得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"
Run Code Online (Sandbox Code Playgroud)

  • 请注意,没有参数的`Process.wait`等待_any_ child,因此在更一般的情况下,即使上面的特定子进程没有退出,此代码段也将退出父代码.一个更精确的版本会说"Process.wait(pid)". (10认同)
  • 让我们在“ Process.waitall”中达成一致。父母将等到** ALL **子女退出。 (2认同)

Chr*_*oyd 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}"
Run Code Online (Sandbox Code Playgroud)

fork方法返回它所分叉的进程的PID,并执行传递的块中的任何代码.与常规Ruby块一样,它保留了父进程的绑定.

制作分叉流程是个好主意exit.

  • @Vadim我认为这是一个功能,而不是一个bug. (6认同)
  • 需要@skwisgaar`exit`以确保分叉过程终止。否则,您可能会遇到僵尸或孤立进程。有关更多信息,请访问:http://stackoverflow.com/a/20689837/3784008。简短说明:在分叉的进程完成运行其代码后,在其分支中调用`exit`,否则生成的新的`ruby`进程将继续在后台运行。 (2认同)