多くの(> 1000)ワーカー(プロセス)がいくつかの作業を行い、作業結果をデータベースに保存したいと考えています。作業の結果はJSONオブジェクトです。ワーカーは1秒あたり1〜5のJSONオブジェクトを生成します。データベースセーバーは分離されたプロセスです。JSONオブジェクトをワーカーからセーバーに転送するための単方向接続はmultiprocessing.Pipeです。パイプの数は労働者の数と同じです。
セーバープロセスでは、定期的に次のことを行います。
def recv_data(self):
data = []
for pipe in self.data_pipe_pool:
if pipe.poll():
data.append(pipe.recv())
return data
self.data_pipe_pool-ワーカーからのパイプのリスト。
100人までのワーカーを実行すれば、すべて正常に動作します。1000を超えるワーカーを実行すると、例外が発生します。
2013-02-13T15:17:40.731429
Traceback (most recent call last):
File "saver.py", line 44, in run
profile = self.poll_data()
File "saver.py", line 116, in poll_data
ret = self.recv_data()
File "saver_unit.py", line 127, in recv_data
if pipe.poll():
IOError: handle out of range in select()
私はこれがselect()
電話によるものであることを知っています:
FD_SETSIZEは通常、GNU/Linuxシステムでは1024に定義されています
しかし、どこで呼ばれselect
ますか?の場合pipe.poll()
、なぜFD_SETSIZE制限を超えるのpipe.poll()
ですか、個別に1つのパイプを呼び出していますか?この呼び出しでPython言語ソースをどこで見ることができますselect
か?
FD_SETSIZE
制限を超えない、または使用しない回避策は何select
ですか?