Python sock.listen(...)
我在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 个回答
从Python 3.5开始,你可以选择把backlog
作为一个默认参数,这样你可以不填这个参数:
如果你不指定这个参数,系统会自动选择一个合理的默认值。从3.5版本开始,backlog参数变成了可选的。
https://docs.python.org/3/library/socket.html#socket.socket.listen
你不需要把listen()
里的参数调得比5大。
这个参数是用来控制有多少个连接还没有被accept()
接受。也就是说,listen()
的参数并不影响同时连接的数量,只影响那些还没有被处理的连接数量。
如果你调整listen()
的参数后,代码有变化,那说明你在每次调用accept()
之间的延迟太长了。你可能需要优化你的accept()
循环,让它的开销更小。
在你的情况中,我猜self.q
是一个Python的队列,那么你可能想用self.q.put_nowait()
来避免在这个调用中阻塞accept()
循环。
文档上是这么说的:
socket.listen(backlog)
是用来监听连接到这个socket的请求。这里的backlog参数指定了可以排队的最大连接数,至少要设置为1;最大值是和系统有关的(通常是5)。
显然,你的系统上这个最大值超过了5。我觉得把它设置得更大应该没问题。也许每个排队的连接会占用一些内存。
我的Linux手册上是这么写的:
如果backlog参数的值大于文件中
/proc/sys/net/core/somaxconn
的值,那么它会被默默地截断到那个值;这个文件中的默认值是128。在2.4.25之前的内核中,这个限制是一个固定的值,叫做SOMAXCONN,值是128。