Eventmachine и внешние скрипты с помощью обратных кавычек - PullRequest
4 голосов
/ 08 февраля 2010

У меня есть небольшой сценарий HTTP-сервера, который я написал с использованием eventmachine, который должен вызывать внешние сценарии / команды и делать это с помощью обратных символов (``). Однако при обработке запросов, которые не запускают код с обратным каналом, все в порядке, но как только мой код EM выполняет какой-либо внешний скрипт с обратным каналом, он перестает обслуживать запросы и вообще прекращает выполнение.

Я заметил, что eventmachine, кажется, чувствителен к подпроцессам и / или потокам, и, похоже, для этого есть метод popen, но источник EM предупреждает, что этот метод не работает под Windows. Многие машины, на которых запущен этот скрипт, работают под управлением Windows, поэтому я не могу использовать popen.

Мне здесь не повезло? Есть ли безопасный способ запустить внешнюю команду из сценария eventmachine под Windows? Можно ли как-нибудь запустить некоторые команды для внешнего запуска, не блокируя выполнение EM?

edit: виновник, который, похоже, испортит EM больше всего, это мое использование команды Windows start, например: start java myclass. Причина, по которой я использую start, заключается в том, что я хочу, чтобы эти внешние сценарии запускались и продолжали работать после обслуживания запроса EM

Ответы [ 3 ]

1 голос
/ 11 апреля 2010

Попробуйте win32-open3 (и, если он должен быть кроссплатформенным, а не только для Windows, посмотрите также POpen4 )

1 голос
/ 23 марта 2010

Документация ruby ​​ гласит, что оператор backtick "Возвращает стандартный вывод выполнения cmd в подоболочке"

Так что если ваша команда ie start java myclass имеет видпродолжая работу, ruby ​​ожидает, пока он завершит передачу своего вывода в вашу программу.

0 голосов
/ 27 ноября 2015

EventMachine имеет пул потоков. Вы можете EM.defer ваши спины, как это

EM.defer { `start java myclass` }

По умолчанию пул потоков имеет 20 потоков, и вы можете изменить его размер, присвоив EM.threadpool_size значение.

Важно отметить, что EM.defer может быть передана операция, которая выполняется в отложенном потоке, обратный вызов, который выполняется в потоке реактора, и ошибка обратного вызова, которая выполняется в потоке реактора, когда операция вызывает исключение.

Если вы используете Java, вы можете рассмотреть возможность использования jruby, который поддерживает реальные потоки, и вы, вероятно, можете повторно использовать свой код Java изнутри jruby.

...