許多(> 1000)的工人(過程)做一些和想要保存在數據庫中的工作成果。工作結果是JSON對象。工人每秒產生1-5個JSON對象。數據庫保存程序是分開的過程。從工作者到保護者傳輸JSON對象的單向連接是multiprocessing.Pipe。管道數量等於工人數量。處理超出範圍選擇
在保護過程中定期сall:
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()
單個管道?我在哪裏可以通過這個電話select
來觀看Python語言資源?
什麼解決辦法不超過FD_SETSIZE
限制或不使用select
?
感謝您的回答。 如何避免陰影調用'select'?可能是存在管道(或over object)epoll API在低級別? – sheh 2013-02-13 15:05:01