マルチプロセッシングのプールを使用してプロセスのグループを実行しようとしています。各プロセスはグリーンレットの gevent プールを実行します。この理由は、多くのネットワーク アクティビティだけでなく、多くの CPU アクティビティがあるためです。そのため、帯域幅とすべての CPU コアを最大化するには、複数のプロセスと 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 のソケット モジュールの動作の違いによるものだと思います。
サブプロセス内でモンキーパッチを実行すると、キューは正常に作成されますが、サブプロセスがキューから get() を実行しようとすると、非常によく似た例外が発生します。サブプロセスで多数のネットワーク要求を実行するため、ソケットにモンキーパッチを適用する必要があります。
私のバージョンのgeventは最新だと思います:
>>> gevent.version_info
(1, 0, 0, 'alpha', 3)
何か案は?