Pregunta:GEvent y multiprocesamiento juntos para comunicarse con un subproceso
¿Puedo usar el módulo de multiprocesamiento junto con GEvent en Windows de una manera eficiente?
Escenario:
Tengo una aplicación basada en Python GEvent haciendo E/S asíncrona en Windows. La aplicación está principalmente vinculada a E/S, pero también hay picos de mayor carga de CPU. Esta aplicación necesitaría controlar una aplicación de consola a través de stdin y stdout. No puedo modificar esta aplicación de consola y el usuario podrá usar la suya propia, solo se corrige el protocolo de comunicación basado en texto (línea).
Tengo una implementación en funcionamiento que usa subprocesos y subprocesos, pero prefiero mover todo el subproceso basado en el código de comunicación junto con esos subprocesos en un proceso separado para volver la aplicación principal a un subproceso único. Planeo usar el módulo de multiprocesamiento para esto.
lectura previa:
He estado buscando en la web mucho y leo algo de código fuente, así que sé que el módulo de multiprocesamiento está utilizando una aplicación de tubería basado en canalizaciones con nombre en Windows. Se usaría un par de objetos multiprocessing.queue.Queue para comunicarse con el segundo proceso de Python. Estas colas se basan en esa implementación de Pipe, p. el IPC se haría a través de tuberías con nombre.
La pregunta clave es si llamar al método get de la cola entrante bloquearía o no el bucle principal de gevent. Hay un tiempo de espera para ese método, por lo que podría hacer un ciclo con un pequeño tiempo de espera, pero esa no es una buena solución, ya que aún bloquearía gevent por períodos de tiempo pequeños que dañaran su baja latencia de E/S.
También estoy abierto a sugerencias sobre cómo eludir todo el problema del uso de tuberías en Windows, que se sabe que es difícil ya veces frágil. No estoy seguro de si la IPC basada en memoria compartida es posible en Windows o no. Tal vez podría envolver la aplicación de la consola de una manera que permita la comunicación con el proceso secundario utilizando sockets de red, que se sabe que funciona bien con gevent.
Por favor, no cuestione mi caso de uso principal, si es posible. Gracias.
Encontré un módulo adecuado para leer y escribir de forma asíncrona las canalizaciones de subprocesos tanto en Windows como en UNIX. Se podría integrar con el ciclo de eventos de gevent para obtener una solución bastante genérica: http://code.activestate.com/recipes/440554-module-to-allow-asynchronous-subprocess-use-on-win/ – fviktor