用Python 判断http下载超时

由于对http请求理解不深入,开始我一直是使用的requests里的timeout参数,即:

req = requests.get(url ,stream = True,timeout = 5)

但在实际的测试中发现,当我们下载大文件的时候,会远远超过5秒,而系统也不会出现异常,这是为什么呢?原因很简单,因为这里的timeout,仅仅是指从发起请求,到服务器响应给我们这中间的时间,而下载过程其实是已经响应成功了,因此就不能通过这种方法来自动中断http下载连接。

要优化这一问题,具体可如下:

STime = time.time() S #文件下载开始时间
n = requests.get(url ,stream = True)

f = open('test','wb')
for chunk in n.iter_content(chunk_size=65536):
if chunk: # filter out keep-alive new chunks
NTime = time.time()
if (NTime - STime > 10): S #判断文件片已下载时间,如果超过10秒,则自动中断线程
raise TooSlowException
f.write(chunk)
f.flush()
f.close()
class TooSlowException(Exception):
"""
用于判断下载速度过慢的异常类
"""
pass
这段代码实际上在分块读取的过程中,加上的时间的判断,并且在每一块保存的时候,和初始时间进行相减比较,就能得到当前下载的时间并判断超时了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,067评论 19 139
  • 声明:本文讲解的实战内容,均仅用于学习交流,请勿用于任何商业用途! 一、前言 强烈建议:请在电脑的陪同下,阅读本文...
    Bruce_Szh阅读 12,814评论 6 28
  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 4,799评论 0 11
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,630评论 0 17
  • 1.简介:  Nginx:engine X ,2002年,开源,商业版 http协议:web服务器(类似于ht...
    尛尛大尹阅读 1,899评论 0 3