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"

program1が終了するまでprogram2を待たずに上記を行う方法はありますか? 各プログラムで新しい 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 )

例:

runner.rb

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

threads.map(&:join)

puts "Everything done!"

sleep.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

実行している OS はわかりませんが、シェル スクリプトでこれを実行してみませんか? 組み込みで、非常に簡単です。

#!/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 に答える