python sokect默认多久断开

 我来答
就烦条0o
2016-01-04 · 知道合伙人软件行家
就烦条0o
知道合伙人软件行家
采纳数:33315 获赞数:46492
从事多年系统运维,喜欢编写各种小程序和脚本。

向TA提问 私信TA
展开全部
在 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() 那么简单。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式