Прежде всего, существует только один экземпляр EventMachine для каждого процесса Ruby, поэтому независимо от того, что вы всегда будете ссылаться на один и тот же экземпляр EM, независимо от потока, в котором вы сейчас находитесь.
Вы запускаете реактор в новом отдельном потоке, чтобы он не блокировал основной поток (целью которого является обслуживание веб-запроса). В противном случае EM.run взял бы управление на себя, войдя в цикл выполнения и больше не выходя из блока EM.run. EM.reactor_running? возвращает true, хорошо, если где-то работает цикл EM. Поскольку для каждого процесса в Ruby существует только один метод, достаточно просто определить, работает EM или нет.
У вас есть простейший способ использовать EM внутри обычного процесса Ruby, не мешая всему, что работает. Я предполагаю, что вы отправляете сообщения брокеру AMQP из своего веб-приложения. Всякий раз, когда вы отправляете сообщение, оно входит в цикл выполнения EM в отдельном потоке, эта часть довольно прозрачна для вас и не влияет на основной цикл, который может продолжить обработку веб-запроса Rails. Будьте осторожны, чтобы всегда вставлять вещи в цикл EM, используя EM.next_tick. Попытка обработать сокеты, открытые EM в разных потоках, может привести к тому, что произойдут плохие вещи, что я наблюдал в производственной среде, между прочим, используя и создавая библиотеку, называемую случившимся;)
Остановка цикла EM перед запуском нового обеспечивает обработку цикла EM, который может остаться от родительского процесса, что может привести к проблемам с файловыми дескрипторами, открытыми с использованием EM, в родительском процессе. В пользовательском коде это можно обойти с помощью EM.fork_reactor, но, поскольку родительский процесс находится вне вашего контроля, наиболее безопасно проверить, существует ли реактор, и остановить его перед запуском нового экземпляра.