gpt4 book ai didi

python - 处理超出范围的选择

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:24:45 25 4
gpt4 key购买 nike

许多(>1000)个 worker (进程)做了一些并想将他们的工作结果保存在数据库中。工作结果是 JSON 对象。 worker 每秒产生 1-5 个 JSON 对象。数据库保存程序是独立的进程。用于将 JSON 对象从 worker 传输到 saver 的单向连接是 multiprocessing.Pipe。管道数量等于 worker 数量。

在保护进程中周期性地调用:

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 - 来自 worker 的管道列表。

如果我运行 ~100 个 worker ,一切都很好。如果我运行 >1000 个 worker ,我会得到异常:

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 is usually defined to 1024 in GNU/Linux systems

但是在哪里调用了select?如果在 pipe.poll() 中,为什么我超过了 FD_SETSIZE 限制,我正在为 1 个管道单独调用 pipe.poll()?我在哪里可以通过此调用 select 观看 python 语言源代码?

什么解决方法不超过 FD_SETSIZE 限制或不使用 select

最佳答案

如果您检查 select manual page ,你会看到:

Executing FD_CLR() or FD_SET() with a value of fd that is negative or is equal to or larger than FD_SETSIZE will result in undefined behavior.

这意味着如果 select 在您的 poll 调用中使用(这似乎很可能),并且您的文件描述符大于 FD_SETSIZE(如果你有超过 1000 个管道,很可能)那么结果可以是任何东西。

关于python - 处理超出范围的选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14853712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com