我在python文档中看到的所有关于sock.listen(5)的示例都建议我应该将最大backlog数量设置为5。这给我的应用程序带来了一个问题,因为我期望的是一些非常大的数据量(许多并发连接)。我将它设置为200,在我的系统上没有看到任何问题,但我想知道在它导致问题之前,我可以将它设置到多高。
有人知道吗?
编辑:这是我的accept()循环。
while True:
try:
self.q.put(sock.accept())
except KeyboardInterrupt:
break
except Exception, e:
self.log("ERR %s" % e)发布于 2010-03-15 08:45:18
医生是这么说的
socket.listen(backlog)侦听与套接字建立的连接。backlog参数指定排队连接的最大数量,应至少为1;最大值取决于系统(通常为5)。
显然,您系统上的系统值大于5。我不明白为什么设置一个更大的数字会有问题。也许为每个排队的连接预留了一些内存。
我的linux手册页上有这样的内容:
如果backlog参数大于/proc/sys/net/core/somaxconn中的值,那么它将被自动截断为该值;此文件中的默认值为128。在2.4.25之前的内核中,此限制是硬编码值SOMAXCONN,其值为128。
发布于 2010-03-15 08:49:41
您不需要将参数listen()调整为大于5的数字。
参数控制允许多少个非accept()-ed连接处于未完成状态。listen()参数与并发连接套接字的数量无关,只与进程未accept()-ed的并发连接数量有关。
如果将参数调整为listen()会对您的代码产生影响,那么这就是每次调用accept()之间出现太多延迟的症状。然后,您可能希望更改您的accept()循环,使其具有较少的开销。
在您的示例中,我猜测self.q是一个python queue,在这种情况下,您可能希望调用self.q.put_nowait(),以避免在此调用中阻塞accept()循环。
发布于 2021-12-13 08:39:36
从Python3.5开始,有一个选项可以将backlog作为默认参数传递,因此您可以将其保留为空:
如果未指定,则选择默认的合理值。版本3.5中的更改: backlog参数现在是可选的。
https://docs.python.org/3/library/socket.html#socket.socket.listen
https://stackoverflow.com/questions/2444459
复制相似问题