python sokect默认多久断开
1个回答
展开全部
在 Python 里面使用 socket 是相对简单的,连接成功以后可以 makefile(), 然后就跟读普通文件一样使用socket. 我们使用 beanstalkd 的客户度 beanstalkc 也是这样的,实现得很简洁。
某一天 beanstalkd 所在的服务器不堪重负失去响应,导致整个应用被阻塞,不可用。罪魁祸首是beanstalkc,它用的是阻塞式的 socket, 不行,于是给它加了个 timeout, 就用 socket.settimeout().
自从设置了timeout, 就不断地冒出timeout异常,而 beanstalkd 看起来却是正常的。在给 beanstalkc 添加了多个后端支持后,居然经常出现N个后端以此超时的奇怪现象。经过调试发现,是某些比较大的对象会导致超时,不管超时时间设置多大。
原来,socket 一旦设置了timeout, 就进入了 non-blocking 工作模式,原来的 send() 和 recv() 等的用法就完全不同了,可能会只发送或者接收了部分数据,需要检查返回值并多次重试。甚至,makefile() 是完全不允许使用的,它已经在 socket 模块的文档中明确声明,不过如果不是在这里栽过跟头很少会注意到这点。
明确了这一点,就可以写出在 non-blocking 模式工作的正确代码,会复杂不少,尤其处理一开始不能确定数据长度的文本协议。
阻塞和非阻塞是完全两种不同的使用方法,并不是添加一个socket.settimeout() 那么简单。
某一天 beanstalkd 所在的服务器不堪重负失去响应,导致整个应用被阻塞,不可用。罪魁祸首是beanstalkc,它用的是阻塞式的 socket, 不行,于是给它加了个 timeout, 就用 socket.settimeout().
自从设置了timeout, 就不断地冒出timeout异常,而 beanstalkd 看起来却是正常的。在给 beanstalkc 添加了多个后端支持后,居然经常出现N个后端以此超时的奇怪现象。经过调试发现,是某些比较大的对象会导致超时,不管超时时间设置多大。
原来,socket 一旦设置了timeout, 就进入了 non-blocking 工作模式,原来的 send() 和 recv() 等的用法就完全不同了,可能会只发送或者接收了部分数据,需要检查返回值并多次重试。甚至,makefile() 是完全不允许使用的,它已经在 socket 模块的文档中明确声明,不过如果不是在这里栽过跟头很少会注意到这点。
明确了这一点,就可以写出在 non-blocking 模式工作的正确代码,会复杂不少,尤其处理一开始不能确定数据长度的文本协议。
阻塞和非阻塞是完全两种不同的使用方法,并不是添加一个socket.settimeout() 那么简单。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询