以下是代码:
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
感谢所有帮助人员!帮助澄清了我的想法。
答案 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