2

我有一个名为 main.rb 的程序,我想做以下事情:

system("ruby", "program1.rb")
sleep 60
system("ruby", "program2.rb")
sleep 60
system("ruby", "program3.rb")
sleep 60
system("ruby", "program4.rb")

puts "Programs are done running"

有没有办法在没有 program2 等到 program1 完成的情况下执行上述操作?我在想它可能必须为每个程序打开一个新的 CLI?另外,我想仅在所有 4 个都完成后才输出“程序已完成运行”消息。有没有办法做到这一点?谢谢!

4

4 回答 4

6

似乎您希望每个程序同时运行,但希望在启动每个子程序之间等待 60 秒,然后等待所有程序完成。 Process::spawn本质上是system返回其 pid 的子进程的背景。这应该可以得到你想要的:

to_run = %w{program1.rb program2.rb program3.rb program4.rb}
pids = [ Process.spawn('ruby', to_run.first) ]
pids.concat to_run.drop(1).map{ |p| sleep(60); Process.spawn('ruby', p) }
Process.waitall
puts 'Everything done!'

如果您在其他地方产生了其他子进程,waitall则将等待所有子进程。要仅等待您在此处生成的集合,请将Process.waitall上面替换为循环wait

pids.delete(wait) until pids.empty?
于 2013-03-22T21:00:08.857 回答
4

您可以Thread为此使用类。特别是 .new 和 #join。(http://www.ruby-doc.org/core-2.0/Thread.html

例子:

跑步者.rb

threads = [1, 2, 3, 4].map do |time|
  Thread.new { system("ruby sleep.rb #{time}") }
end

threads.map(&:join)

puts "Everything done!"

睡眠.rb

sleep ARGV[0].to_i

输出

> time ruby runner.rb
Everything done!
ruby runner.rb  0.24s user 0.05s system 7% cpu 4.125 total
于 2013-03-22T19:57:41.220 回答
1

我想你想要Process.spawn。如果您想在生成终止状态后获得有关终止状态的信息,请使用Process.wait. 这是相关文档;可能值得一读,以确定您想要做什么。

于 2013-03-22T19:58:29.347 回答
1

如果你想让进程在 Ruby 中并行运行,你需要研究线程,或者比使用system.

你没有说你正在运行什么操作系统,但你为什么不使用 shell 脚本来做呢?它是内置的并且非常简单:

#!/bin/sh

ruby program1.rb &
sleep 60
ruby program2.rb &
sleep 60
ruby program3.rb &
sleep 60
ruby program4.rb &

&在 Linux 和 Mac OS 上将命令置于后台,因此脚本将立即重新获得控制权并休眠 60 秒。

除非您正在等待所有程序都完成,否则说“程序已完成运行”是没有意义的,这需要更多的工作。

于 2013-03-22T20:36:46.160 回答