Вопрос:
Могу ли я эффективно использовать многопроцессорный модуль вместе с Gevent в Windows?
Сценарий:
У меня есть приложение Python на основе Gevent, которое выполняет асинхронный ввод-вывод в Windows. Приложение в основном связано с вводом / выводом, но также наблюдаются скачки загрузки процессора. Это приложение должно управлять консольным приложением через его стандартный ввод и стандартный вывод. Я не могу изменить это консольное приложение, и пользователь сможет использовать свое собственное, только фиксированный протокол связи на основе текста (строки).
У меня есть рабочая реализация, использующая подпроцесс и потоки, но я бы предпочел перенести весь код связи на основе подпроцесса вместе с этими потоками в отдельный процесс, чтобы превратить основное приложение в однопоточное. Я планирую использовать для этого многопроцессорный модуль.
До прочтения:
Я много искал в Интернете и читал некоторый исходный код, поэтому я знаю, что многопроцессорный модуль использует реализацию Pipe, основанную на именованных каналах в Windows. Пара объектов multiprocessing.queue.Queue будет использоваться для связи со вторым процессом Python. Эти очереди основаны на той реализации Pipe, например, IPC будет осуществляться через именованные каналы.
Ключевой вопрос заключается в том, блокирует ли вызов метода get входящей очереди основной цикл gevent или нет. У этого метода есть тайм-аут, поэтому я мог бы превратить его в цикл с небольшим тайм-аутом, но это не очень хорошее решение, так как он все еще блокировал бы gevent на небольшие промежутки времени, нанося ущерб его низкой задержке ввода / вывода.
Я также открыт для предложений о том, как обойти всю проблему использования каналов в Windows, которая, как известно, является сложной, а иногда и хрупкой. Я не уверен, возможен ли IPC на основе общей памяти в Windows или нет. Возможно, я мог бы обернуть консольное приложение таким образом, чтобы можно было обмениваться данными с дочерним процессом с помощью сетевых сокетов, что, как известно, хорошо работает с gevent.
Пожалуйста, не ставьте под сомнение мой основной вариант использования, если это возможно. Спасибо.