2012-02-18 5 views
1

다른 OS 플랫폼간에 코드를 전송할 수 있도록 루비 스레드를 사용하는 방법을 배웁니다.콘솔에서 멀티 스레딩을 제어하는 ​​방법

문제는 콘솔도 시작되는 non_join2을 방지 non_join1 완료 될 때까지 동결이다. non_join1은 스레드가 완료 될 때까지 join 명령을 기다립니다.

소프트웨어는 독립적으로 실행되는 여러 루틴이 필요합니다. 기본 프로그램은 실시간으로 데이터를 수집하는 독립 실행 형 프로그램입니다. 수집 된 데이터는 파일에 기록됩니다. Threads를 사용하는 여러 프로그램이 병렬로 데이터를 처리합니다. 시작/정지 및 상태는 주 콘솔에서 제어됩니다.

데이터 파일을 분석하고 스레드에서 상태를 복원하는 데 필요한 별도의 프로그램을 실행하는 가장 좋은 루비 방법은 무엇입니까?

덕분에, PB

대신 예를 들어이 기능을 사용하여,이 포크 (fork) (새로운 프로세스를 생성)을 시도``으로 실행
# 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'이 끝날 때까지 기다리지 않으려면 전자 전화? 그것을 위해서 당신은'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 
관련 문제