Python sock.listen(...)

11 投票
3 回答
37416 浏览
提问于 2025-04-15 20:26

我在Python文档中看到的所有关于sock.listen(5)的例子都建议我把最大等待连接数设置为5。这对我的应用程序造成了问题,因为我预计会有很多用户同时连接。我把这个数字设置成了200,结果在我的系统上没有出现任何问题,但我想知道我能把这个数字设置得多高而不会引发问题。

有人知道吗?

编辑:这是我的accept()循环。

while True:    
    try:
        self.q.put(sock.accept())
    except KeyboardInterrupt:
        break
    except Exception, e:
        self.log("ERR %s" % e)

3 个回答

0

从Python 3.5开始,你可以选择把backlog作为一个默认参数,这样你可以不填这个参数:

如果你不指定这个参数,系统会自动选择一个合理的默认值。从3.5版本开始,backlog参数变成了可选的。

https://docs.python.org/3/library/socket.html#socket.socket.listen

19

你不需要把listen()里的参数调得比5大。

这个参数是用来控制有多少个连接还没有被accept()接受。也就是说,listen()的参数并不影响同时连接的数量,只影响那些还没有被处理的连接数量。

如果你调整listen()的参数后,代码有变化,那说明你在每次调用accept()之间的延迟太长了。你可能需要优化你的accept()循环,让它的开销更小。

在你的情况中,我猜self.q是一个Python的队列,那么你可能想用self.q.put_nowait()来避免在这个调用中阻塞accept()循环。

13

文档上是这么说的:

socket.listen(backlog) 是用来监听连接到这个socket的请求。这里的backlog参数指定了可以排队的最大连接数,至少要设置为1;最大值是和系统有关的(通常是5)。

显然,你的系统上这个最大值超过了5。我觉得把它设置得更大应该没问题。也许每个排队的连接会占用一些内存。

我的Linux手册上是这么写的:

如果backlog参数的值大于文件中/proc/sys/net/core/somaxconn的值,那么它会被默默地截断到那个值;这个文件中的默认值是128。在2.4.25之前的内核中,这个限制是一个固定的值,叫做SOMAXCONN,值是128。

撰写回答