Несколько Ruby EventMachines в одном процессе: возможно? - PullRequest
7 голосов
/ 23 ноября 2011

У меня есть ситуация, когда я хочу запустить несколько EventMachines в Ruby - у кого-нибудь есть опыт с этим? (Я могу написать тестовый пример, чтобы сделать это сам, если нет. Оставайтесь с нами).

Давайте проясним: я хочу создать два потока сам и вызвать EventMachine.run в обоих потоках, так что у меня действительно есть две реакторные петли.

Причина в том, что я пишу асинхронную шину сообщений с гемом AMQP, который использует EventMachine. Это нормально, но я хочу сделать это отдельным модульным компонентом, который можно использовать в двух приложениях:

  • тот, который имеет свой собственный цикл блокировки графического интерфейса (который не может быть смоделирован путем вызова тика из EventMachine - он действительно блокирует, и делает это в библиотеке C, поэтому я не могу его взломать). Это просто - просто запустите EM в своем собственном потоке и делитесь входящими сообщениями между циклами потокобезопасным способом;
  • и другое приложение, которое само по себе работает в цикле реактора, которым я мог бы потенциально поделиться с кодом AMQP (что хорошо для проблем безопасности потоков - хотя я должен решить их в любом случае для вышеупомянутого приложения) ). Именно это заставило меня задуматься ... могу ли я поделиться кодом шины сообщений с вышеуказанным приложением, запустив две отдельные EventMachines?

У кого-нибудь есть мысли?

Ответы [ 2 ]

7 голосов
/ 23 ноября 2011

ОК, копаясь в документах EM, я вижу тело для EventMachine.run, начинающееся с этого:

240:     if reactor_running?
241:       (b = blk || block) and b.call # next_tick(b)
242:     else
         ... start the reactor ...

Это потрясающе. Похоже, что если вы выполняете EventMachine.run в нескольких потоках, он запланирует определение второй машины - блока, переданного для «запуска» - на реакторе, который уже работает.

Мне нравится эта библиотека.

3 голосов
/ 06 декабря 2011

Вы ответили сами, но я хотел добавить свои 2 цента без ужасного оформления комментариев.

# this will start the eventmachine reactor
EM::run do

  # do something

  # this will do nothing and the block passed to it will
  # just be executed directly
  EM::run do
    # do something else
  end

end
...