Несколько асинхронных обратных вызовов из EventMachine - есть ли лучший способ справиться с этим? - PullRequest
2 голосов
/ 12 ноября 2011

Я использую библиотеку EventMachine Ruby для асинхронного доступа к внешним API RESTful с сервера Ruby, который я пишу.Один из методов, которые я делаю доступными через мой сервер, требует доступа к нескольким внешним API и агрегирования ответов перед возвратом ответа клиенту, обращающемуся к моему серверу.Вот как я это делаю сейчас ...

def aggregate
  responses = Array.new
  done      = 0

  # clients are EM::Deferrable objects...
  clients.each do |client|
    client.callback do |response|
      responses << response
      done += 1
    end

    client.errback do |response|
      done += 1
    end
  end

  until done == clients.length
    sleep 1
  end

  return responses
end

Есть ли лучшие способы справиться с такой ситуацией?Возможно ли, что класс EM :: Completion, поставляемый в версии 1.0.0 EventMachine, обеспечит сантехнику, которая лучше поддерживает такой сценарий использования?не могу найти аналогичный вопрос в StackOverflow), поэтому мне любопытно посмотреть, как другие подошли к проблеме.

1 Ответ

3 голосов
/ 13 ноября 2011

Прежде всего, использование сна полностью разрушает цель EventMachine. Вы блокируете цикл обработки событий этим. Мне нужна большая картина для предложения о том, как это сделать лучше, но ваш код должен привыкнуть к тому факту, что метод возвращается до выполнения всех запросов. В качестве альтернативы посмотрите на em-synchrony , чтобы узнать, как выполнять выравнивание процедурного стиля с помощью волокон Руби (прозрачных для вас).

Один из способов уменьшить клейкий код для параллельного выполнения нескольких запросов - использовать что-то вроде em-http-запросы мультиинтерфейс , который работает как с методом обратного вызова EventMachine, так и с em-synchrony. 1007 *

EM :: Завершение, с другой стороны, скорее расширенный, отсроченный, в этом случае вам точно не поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...