0

这是代码:

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

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

4

3 回答 3

4

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

例如,

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

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

于 2011-07-07T03:28:58.617 回答
2

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

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

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

于 2011-07-07T02:53:48.747 回答
-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
于 2018-11-22T06:42:08.267 回答