如何使用python请求执行限时响应下载?

发布于 2021-01-29 15:26:14

使用python下载大文件时,我不仅要为连接过程设置时间限制,还要为下载设置时间限制。

我正在尝试以下python代码:

import requests

r = requests.get('http://ipv4.download.thinkbroadband.com/1GB.zip', timeout = 0.5, prefetch = False)

print r.headers['content-length']

print len(r.raw.read())

正如文档中正确指出的那样,这不起作用(下载没有时间限制):https
:
//requests.readthedocs.org/en/latest/user/quickstart/#timeouts

如果可能的话,那会很棒:

r.raw.read(timeout = 10)

问题是,如何为下载设置时间限制?

关注者
0
被浏览
43
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    答案是:不要使用请求,因为它正在阻塞。使用非阻塞网络I / O,例如eventlet:

    import eventlet
    from eventlet.green import urllib2
    from eventlet.timeout import Timeout
    
    url5 = 'http://ipv4.download.thinkbroadband.com/5MB.zip'
    url10 = 'http://ipv4.download.thinkbroadband.com/10MB.zip'
    
    urls = [url5, url5, url10, url10, url10, url5, url5]
    
    def fetch(url):
        response = bytearray()
        with Timeout(60, False):
            response = urllib2.urlopen(url).read()
        return url, len(response)
    
    pool = eventlet.GreenPool()
    for url, length in pool.imap(fetch, urls):
        if (not length):
            print "%s: timeout!" % (url)
        else:
            print "%s: %s" % (url, length)
    

    产生预期的结果:

    http://ipv4.download.thinkbroadband.com/5MB.zip: 5242880
    http://ipv4.download.thinkbroadband.com/5MB.zip: 5242880
    http://ipv4.download.thinkbroadband.com/10MB.zip: timeout!
    http://ipv4.download.thinkbroadband.com/10MB.zip: timeout!
    http://ipv4.download.thinkbroadband.com/10MB.zip: timeout!
    http://ipv4.download.thinkbroadband.com/5MB.zip: 5242880
    http://ipv4.download.thinkbroadband.com/5MB.zip: 5242880
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看