【问题标题】:How to run multiple ruby daemons and handle input and output of each daemon?如何运行多个 ruby​​ 守护进程并处理每个守护进程的输入和输出?
【发布时间】:2011-09-30 02:50:15
【问题描述】:

代码如下:

while 1
    input = gets
    puts input
end

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

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

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

Q3:脚本使用 cmd "gets" 来获取输入,我如何将输入传递到个人脚本的 get 中?

例如

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

谢谢!

更新: 回答了我自己的问题。找到了这个很棒的 tut: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

感谢大家的帮助!帮助澄清了我的想法。

【问题讨论】:

  • 你将如何指定你正在与哪个守护进程通信?您是否从命令行发送信息?您想要另一个与特定守护进程通信的 Ruby 程序吗?你能描述一下你真正想要完成的事情吗(比“获取”和“放置”更多的细节)?
  • 我不知道如何选择与哪个守护进程进行通信,抱歉 - 没有说得足够清楚。是的,我正在从 cmd 行发送信息。我会尽量让它更清楚。

标签: ruby daemon daemons


【解决方案1】:

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

例如,

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

在 Ruby 程序中“处理输入和输出”有很多方法。管道、套接字等。既然您询问了守护进程,我假设您的意思是网络 I/O。见Net::HTTP

【讨论】:

  • 对于输入,我想象后台有多个脚本等待使用“gets”输入。我猜我会对每个脚本都有某种 id(你是怎么做到的?),我想知道访问每个脚本的输入流的方法,所以我调用 pass input 来获取。
  • 这将有助于准确了解您要解决的问题。 UNIX 提供了允许程序在生产者-消费者关系中通过“管道”相互“对话”的设施。通信的细节由操作系统处理;您需要做的就是将一个程序输出到标准输出流(STDOUT),另一个从标准输入(STDIN)读取。 Google 将在这方面为您提供很大帮助,一本好的操作系统书籍也将如此。
【解决方案2】:

忽略你认为多个守护进程同时争夺 STDIN 会发生什么:

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

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

【讨论】:

  • 但我也希望能够选择输入哪个线程并从中获取输出。
  • @Waley 那我不明白。如果您可以编辑您的问题,并详细说明您要完成的工作,这将很有帮助。
  • 抱歉,我已经添加了更多细节。
【解决方案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

【讨论】:

    猜你喜欢
    • 2011-10-06
    • 2023-03-02
    • 2012-10-13
    • 2013-06-07
    • 2023-03-10
    • 2012-10-08
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    相关资源
    最近更新 更多