Gevent Monkeypatching ломая многопроцессорность

Я пытаюсь использовать пул мультипроцессора для запуска группы процессов, каждый из которых будет запускать пул gevent из Gevent. Причиной этого является то, что существует большая сетевая активность, но также и большая нагрузка на процессор, поэтому для максимизации пропускной способности и всех ядер процессора мне нужно несколько процессов и асинхронное исправление обезьян в gevent. Я использую диспетчер мультипроцессинга, чтобы создать очередь, к которой процессы получат доступ, чтобы получить данные для обработки.

Вот упрощенный фрагмент кода:

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.

Если я выполняю monkeypatch внутри подпроцесса, очередь создается успешно, но когда подпроцесс пытается получить () из очереди, возникает очень похожее исключение. Сокет должен быть пропатчен из-за большого количества сетевых запросов в подпроцессах.

Моя версия gevent, которую я считаю самой последней:

>>> gevent.version_info
(1, 0, 0, 'alpha', 3)

Есть идеи?

Ответы на вопрос(5)

Ваш ответ на вопрос