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数据的队列。
答案 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)