Вы не можете использовать любую из команд EM без использования EM.run {}. Ничего не произойдет, команды не отправлены, данные не получены, вызовы не запущены.
Большая часть кода 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)