使用本地处理程序调用EventMachine.popen

时间:2011-12-16 19:41:26

标签: ruby subprocess eventmachine

Ruby的EventMachine.popen似乎需要一个基于全局模块的处理程序。这是一种矫枉过正,因为似乎不可能有本地处理程序,例如:

def local_run(cmd)
  q = EventMachine::Queue.new
  module Handler
    def receive_data data
      q.push data
    end
  end
  EM.system(cmd, Handler)
  q
end

以上代码无法运行; ruby抱怨module definition in method body (SyntaxError)

有没有办法为EM.system定义本地处理程序?

我所关心的只是能够异步运行本地命令,并返回一个包含STDOUT数据的队列。

1 个答案:

答案 0 :(得分:2)

如果不使用EM.run {},则无法使用任何EM命令。什么都不会发生,没有发送命令,没有收到数据,也没有触发回调。

大多数EM代码可以使用模块,也可以使用类,或者可以在调用函数时定义。

您可以执行以下操作:

EM.popen("ls -l") do |p|
  def p.receive_data(data)
   puts data
  end
end

哪个应该做同样的事情(但是不能接受自定义参数,例如问题中的队列)。

你也应该能够(这次,有队列):

class Foo < EM::Connection
  def initialize(q)
    @q = q
  end
  def receive_data(data)
    @q.push data
  end
end
EM.popen("ls -l", Foo, EventMachine::Queue.new)