Estoy intentando utilizar el grupo de multiprocesamiento para ejecutar un grupo de procesos, cada uno de los cuales ejecutará un conjunto gevent de áreas verdes. La razón de esto es que hay mucha actividad de red, pero también mucha actividad de la CPU, así que para maximizar mi ancho de banda y todos los núcleos de mi CPU, necesito múltiples procesos y el parche mono asíncrono de gevent. Estoy usando el administrador de multiprocesamiento para crear una cola a la que accederán los procesos para que los datos se procesen.Gevent monopatching rompiendo multiprocesamiento
Aquí es un fragmento simplificada del código:
import multiprocessing
from gevent import monkey
monkey.patch_all(thread=False)
manager = multiprocessing.Manager()
q = manager.Queue()
Aquí es la excepción que produce:
Traceback (most recent call last):
File "multimonkeytest.py", line 7, in <module>
q = manager.Queue()
File "/usr/local/Cellar/python/2.7.2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/managers.py", line 667, in temp
token, exp = self._create(typeid, *args, **kwds)
File "/usr/local/Cellar/python/2.7.2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/managers.py", line 565, in _create
conn = self._Client(self._address, authkey=self._authkey)
File "/usr/local/Cellar/python/2.7.2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/connection.py", line 175, in Client
answer_challenge(c, authkey)
File "/usr/local/Cellar/python/2.7.2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/connection.py", line 409, in answer_challenge
message = connection.recv_bytes(256) # reject large message
IOError: [Errno 35] Resource temporarily unavailable
Creo que esto debe ser debido a alguna diferencia entre el comportamiento de la toma de corriente normal, Módulo y módulo de socket gevent.
Si monopatch dentro del subproceso, la cola se crea con éxito, pero cuando el subproceso intenta obtener() de la cola, se produce una excepción muy similar. El socket necesita ser parcheado debido a la gran cantidad de solicitudes de red en los subprocesos.
Mi versión de GEvent, que creo que es la última:
>>> gevent.version_info
(1, 0, 0, 'alpha', 3)
¿Alguna idea?
relacionado: http://bugs.python.org/issue6056 – jfs