首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python sock.listen(...)

Python sock.listen(...)
EN

Stack Overflow用户
提问于 2010-03-15 08:38:15
回答 3查看 28.5K关注 0票数 8

我在python文档中看到的所有关于sock.listen(5)的示例都建议我应该将最大backlog数量设置为5。这给我的应用程序带来了一个问题,因为我期望的是一些非常大的数据量(许多并发连接)。我将它设置为200,在我的系统上没有看到任何问题,但我想知道在它导致问题之前,我可以将它设置到多高。

有人知道吗?

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

代码语言:javascript
复制
while True:    
    try:
        self.q.put(sock.accept())
    except KeyboardInterrupt:
        break
    except Exception, e:
        self.log("ERR %s" % e)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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。

票数 12
EN

Stack Overflow用户

发布于 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()循环。

票数 16
EN

Stack Overflow用户

发布于 2021-12-13 08:39:36

从Python3.5开始,有一个选项可以将backlog作为默认参数传递,因此您可以将其保留为空:

如果未指定,则选择默认的合理值。版本3.5中的更改: backlog参数现在是可选的。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2444459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档