如何运行多个ruby守护进程并处理每个守护进程的输入和输出?

时间:2011-07-07 02:32:51

标签: ruby daemon daemons

以下是代码:

while 1
    input = gets
    puts input
end

这是我想做的,但我不知道该怎么做: 我想创建多个代码实例以在后台运行,并能够将输入传递给特定实例。

Q1:如何在后台运行脚本的多个实例?

Q2:我如何引用脚本的单个实例,以便将输入传递给实例(Q3)?

问题3:脚本使用cmd“gets”来获取输入,我如何将输入传递给indivdual的脚本?

e.g

假设我在后台运行代码的三个实例,我将实例分别称为#1,#2和#3。 我将“你好”传递给#1,#1将“你好”传递给屏幕。 然后我将“world”传递给#3,#3将“hello”传递给屏幕。

谢谢!

更新: 回答了我自己的问题。找到了这个令人敬畏的啧啧: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 个答案:

答案 0 :(得分:4)

我认为你的意思是你想要同时运行多个Ruby代码。你可以使用Ruby线程(它们有自己的gotchas)来完成它,或者你可以使用你的操作系统的作业控制工具。如果你正在使用UNIX-y,你可以将每个守护进程的代码放在单独的.rb文件中并同时运行它们。

如,

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

在Ruby程序中有很多方法可以“处理输入和输出”。管道,套接字等。由于您询问了守护进程,我认为您的意思是网络I / O.请参阅Net::HTTP

答案 1 :(得分:2)

忽略你认为多个守护进程同时在争夺STDIN时会发生的事情:

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

这将创建三个无限循环的线程,请求输入然后输出它。每个线程都“加入”,阻止主程序退出,直到每个线程完成(它永远不会)。

答案 2 :(得分:-3)

您可以尝试使用具有运行多个守护程序并对其进行控制的功能的 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