Python中socket中的listen()里参数(数字)到底代表什么?

20190627124733822.png

在调用socket的时候,我们会使用到listen()函数,里面有个参数叫backlog, 例如:socket.listen(5). 那么这个数字5到底代表什么意思呢?
解答
下面使用具体的代码片段来讲解:

  • 这是一个电脑本机模拟客服端及服务端的程序,主要功能是建立socket连接后,客户端输入关键字查询对应的段子,服务器端返回结果。
  • 服务器可以满足同时服务两个客户的查询操作
  • 此程序中还包含了信号量和多线程

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0hGWmVuZw==,size_16,color_FFFFFF,t_70

以listen(1),参数设置为1进行讲解,是不是将参数设置为1后,开启3个客服连接就会报错呢?
并不是!如下图所示:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0hGWmVuZw==,size_16,color_FFFFFF,t_70

那么问题来了!

问题1:
如上例代码中,有listen(1),这个1是指什么?只能与1个socket建立链接吗? 为什么我用上面的代码可以创建大于1个的tcp连接却没报错,如果用网上其他人的说法理论上大于1个连接应该报错的!

因为:listen(n)传入的值, n表示的是服务器拒绝(超过限制数量的)连接之前,操作系统可以挂起的最大连接数量。n也可以看作是"排队的数量"

问题2:
既然没有报错,为什么没有打印用户3的地址?

因为:服务器正在处理用户1和用户2,没有空闲去接待用户3,所以用户3去排队了。

问题3:
为什么服务器能同时处理用户1和用户2?
因为:

这里用到了多线程和信号量,信号量设置为2,也就是允许并发数为2,服务器开启了两个线程,能同时分别处理用户1和用户2。

总结
socket.listen(n)
简单来说,这里的nt表示socket的”排队个数“

一般情况下,一个进程只有一个主线程(也就是单线程),那么socket允许的最大连接数为: n + 1
如果服务器是多线程,比如上面的代码例子是开了2个线程,那么socket允许的最大连接数就是: n + 2

换句话说:排队的人数(就是那个n) + 正在就餐的人数(服务器正在处理的socket连接数) = 允许接待的总人数(socket允许的最大连接数)

转载于:https://www.cnblogs.com/gaohuayan/p/11139397.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值