Как запустить несколько демонов ruby ​​и обрабатывать ввод и вывод каждого демона? - PullRequest
0 голосов
/ 07 июля 2011

Вот код:

while 1
    input = gets
    puts input
end

Вот что я хочу сделать, но я понятия не имею, как это сделать: Я хочу создать несколько экземпляров кода для запуска в фоновом режиме и иметь возможность передавать входные данные для конкретного экземпляра.

Q1: Как запустить несколько экземпляров скрипта в фоновом режиме?

Q2: Как обратиться к отдельному экземпляру сценария, чтобы я мог передать входные данные в экземпляр (Q3)?

В3: Скрипт использует cmd «получает» для получения ввода, как бы я передал ввод в получение скрипта индивида?

1012 * например *

Допустим, я запускаю три экземпляра кода в фоновом режиме и называю этот экземпляр № 1, № 2 и № 3 соответственно. Я передаю "привет" # 1, # 1 выводит "привет" на экран. Затем я передаю «мир» №3, а №3 выводит «привет» на экран.

Спасибо!

UPDATE: Ответил на мой собственный вопрос. Нашел этот классный текст: http://rubylearning.com/satishtalim/ruby_threads.html и ресурс здесь: http://www.ruby -doc.org / core / classes / Thread.html # M000826 .

puts Thread.main

x = Thread.new{loop{puts 'x'; puts gets; Thread.stop}}
y = Thread.new{loop{puts 'y'; puts gets; Thread.stop}}
z = Thread.new{loop{puts 'z'; puts  gets; Thread.stop}}

while x.status != "sleep" and y.status != "sleep" and z.status !="sleep"
    sleep(1)
end

Thread.list.each {|thr| p thr }

x.run
x.join

Спасибо за помощь, ребята! Помогите прояснить мое мышление.

Ответы [ 3 ]

4 голосов
/ 07 июля 2011

Я предполагаю, что вы имеете в виду, что вы хотите, чтобы несколько битов кода Ruby выполнялись одновременно.Вы можете сделать это трудным способом, используя потоки Ruby (которые имеют свои gotchas ), или вы можете использовать средства управления заданиями вашей ОС.Если вы используете что-то UNIX-y, вы можете просто поместить код для каждого демона в отдельные файлы .rb и запустить их одновременно.

Например,

# ruby daemon1.rb &
# ruby daemon2.rb &

ТамЕсть много способов "обработать ввод и вывод" в программе на Ruby.Трубы, сокеты и т. Д. Поскольку вы спрашивали о демонах, я предполагаю, что вы имеете в виду сетевой ввод / вывод.См. Net :: HTTP .

2 голосов
/ 07 июля 2011

Игнорирование того, что вы думаете, произойдет с несколькими демонами, которые все сражаются за STDIN одновременно:

(1..3).map{ Thread.new{ loop{ puts gets } } }.each(&:join)

Это создаст три потока, которые зацикливаются бесконечно, запрашивая ввод, а затем выводя его. Каждый поток «присоединен», предотвращая выход основной программы до тех пор, пока не завершится каждый поток (чего никогда не будет).

0 голосов
/ 22 ноября 2018

Вы можете попробовать использовать multi_daemons gem, который может запускать несколько демонов и управлять ими.

# this is server.rb

proc_code = Proc do
  loop do
    sleep 5
  end
end

scheduler = MultiDaemons::Daemon.new('scripts/scheduler', name: 'scheduler', type: :script, options: {})
looper = MultiDaemons::Daemon.new(proc_code, name: 'looper', type: :proc, options: {})
MultiDaemons.runner([scheduler, looper], { force_kill_timeout: 60 })

Для запуска и остановки

ruby server.rb start
ruby server.rb stop
...