许多(> 1000)工人(流程)做了一些工作并希望将他们的工作结果保存在数据库中。工作结果是 JSON 对象。工人每秒产生 1-5 个 JSON 对象。数据库保护程序是独立的进程。用于将 JSON 对象从 worker 传输到 saver 的单向连接是 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
?