Как управлять многопоточностью с консоли - PullRequest
1 голос
/ 19 февраля 2012

Обучение использованию потоков Ruby для переносимости кода между различными платформами ОС.

Проблема в том, что консоль зависла до завершения non_join1, что также препятствует запуску non_join2.non_join1 ожидает команды соединения до тех пор, пока не завершатся потоки.

Для программного обеспечения требуется, чтобы несколько подпрограмм выполнялись независимо.Основная программа - это автономная программа, которая работает в режиме сбора данных в реальном времени.Собранные данные записываются в файлы.Различные программы, использующие потоки, обрабатывают данные параллельно.Запуск / останов и состояние контролируются с главной консоли.

Какой лучший метод ruby ​​для запуска отдельных программ, необходимых для анализа файлов данных и получения статуса из потоков?

спасибо, пб

# 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 Ответ

1 голос
/ 20 февраля 2012

Вместо выполнения с `` попробуйте этот разветвление (создание нового процесса), используя, например, эту функцию:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...