Я пытаюсь использовать многопроцессорный пул для запуска группы процессов, каждый из которых будет запускать пул gevent из зеленых. Причина этого в том, что существует большая активность в сети, но также много активности процессора, поэтому, чтобы максимизировать пропускную способность и все мои ядра процессора, мне нужно несколько процессов и асинхронная обезьяна gevent. Я использую менеджер многопроцессорности для создания очереди, к которой процессы будут обращаться, чтобы получить данные для обработки.Gevent monkeypatching break interprocessing
Вот упрощенный фрагмент кода:
import multiprocessing
from gevent import monkey
monkey.patch_all(thread=False)
manager = multiprocessing.Manager()
q = manager.Queue()
Вот исключение производит:
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
Я считаю, что это должно быть связано с какой-то разницы между поведением нормальной розетки модуль и модуль разъема gevent.
Если я обезвреживаю в подпроцессе, очередь создается успешно, но когда подпроцесс пытается получить() из очереди, возникает очень похожее исключение. Сокет должен быть обезврежен из-за большого количества сетевых запросов в подпроцессах.
Моя версия GEvent, который я считаю, является последним:
>>> gevent.version_info
(1, 0, 0, 'alpha', 3)
Любые идеи?
, связанный с этим: http://bugs.python.org/issue6056 – jfs