2012-02-18 4 views
1

Rubyスレッドを使用して、異なるOSプラットフォーム間でコードを転送する方法を学ぶ。コンソールからマルチスレッドを制御する方法

問題は、non_join1が完了するまでコンソールが凍結され、non_join2が起動しないようにすることです。 non_join1は、スレッドが完了するまでjoinコマンドを待機します。

このソフトウェアでは、独立して動作する複数のルーチンが必要です。プライマリプログラムは、リアルタイムでデータを収集するスタンドアローンです。収集されたデータはファイルに書き込まれます。スレッドを使用する異なるプログラムは、データを並行して処理します。起動/停止とステータスはメインコンソールから制御されます。

データファイルを分析してスレッドからステータスを取得するために必要な別のプログラムを起動するには、最高のルビーメソッドは何ですか?代わりに、例えば、この機能を使用して、 ``(新しいプロセスを作成する)このフォークを試して実行する

おかげで、 PB

# This is the console that starts up the multiple threads. 
#!/usr/bin/ruby 

loop do 
puts " input a command" 
command = gets.chop! 
control = case command 
    when "1" : "1" 
    when "2" : "2" 
    end 
if control == "1" then 
puts `date`+ "routine 1" 
puts `./non_join1.rb` 
puts `date` 
end 

if control == "2" then 
puts `date` + "routine 2" 
`./non_join2.rb`  
end 

end 


#!/usr/bin/ruby 
# Example of worker program 1 used to process data files 
#file non_join1.rb 
x = Thread.new { sleep 0.1; print "xxxxxxxxx"; print "yyyyyyyyyyy"; print "zzzzzzzzzz" } 
a = Thread.new { print "aaaaaaaaa"; print "bbbbbbbbbb"; sleep 0.1; print "cccccccc" } 
puts " " 
(1..10).each {|i| puts i.to_s+" done #{i}"} 
x.join 
a.join 
sleep(30) 

#!/usr/bin/ruby 
# Example of worker program 2 used to process data files 
#file non_join2.rb 
x = Thread.new { sleep 0.1; print "xxxxxxxxx"; print "yyyyyyyyyyy"; print "zzzzzzzzzz" } 
a = Thread.new { print "aaaaaaaaa"; print "bbbbbbbbbb"; sleep 0.1; print "cccccccc" } 
x.join 
a.join 



$ ./call_ruby.rb 
input a command 
1 
Sat Feb 18 10:36:43 PST 2012 
routine 1 
aaaaaaaaabbbbbbbbbb 
1 done 1 
2 done 2 
3 done 3 
4 done 4 
5 done 5 
6 done 6 
7 done 7 
8 done 8 
9 done 9 
10 done 10 
xxxxxxxxxyyyyyyyyyyyzzzzzzzzzzcccccccc 
Sat Feb 18 10:37:13 PST 2012 
input a command 
+1

したがって、プログラムが '。/ non_join1'が終了してから戻るのを待たないようにするeコール?そのためには、 'Process.spawn'を使用します。 – Linuxios

答えて

1

class Execute 
    def self.run(command) 
    pid = fork do 
     Kernel.exec(command) 
    end 
    return pid 
    end 
end 

は、あなたのコードは

のようになります。
loop do 
    puts " input a command" 
    command = gets.chop! 
    control = case command 
    when "1" : "1" 
    when "2" : "2" 
    end 
    if control == "1" then 
    puts `date`+ "routine 1" 
    Execute.run("./non_join1.rb") 
    puts `date` 
    end 

    if control == "2" then 
    puts `date` + "routine 2" 
    Execute.run("./non_join2.rb") 
    end 

end 
関連する問題