我有一个名为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个完成时才会显示消息有没有办法做到这一点? 谢谢!
答案 0 :(得分: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?
答案 1 :(得分:4)
您可以使用Thread
类。特别是.new和#join。 (http://www.ruby-doc.org/core-2.0/Thread.html)
示例:
threads = [1, 2, 3, 4].map do |time|
Thread.new { system("ruby sleep.rb #{time}") }
end
threads.map(&:join)
puts "Everything done!"
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
答案 2 :(得分:1)
我想你想要Process.spawn
。如果您在产生终止状态后想要了解终止状态,请使用Process.wait
。 Here's the relevant documentation; probably worth a read to figure out exactly what you want to do.
答案 3 :(得分: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秒。
说“程序已经完成运行”是没有意义的,除非你等待所有这些程序完成,这需要更多的工作。