Вызов EventMachine.popen с локальным обработчиком - PullRequest
1 голос
/ 16 декабря 2011

Ruby's 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

Приведенный выше код не будет работать; Рубин жалуется module definition in method body (SyntaxError)

Есть ли способ определить локальные обработчики для EM.system?

Все, что меня волнует, это возможность асинхронно выполнять локальные команды и возвращать очередь, которая будет содержать данные STDOUT.

1 Ответ

2 голосов
/ 17 декабря 2011

Вы не можете использовать любую из команд 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)
...