许多(> 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