pythontimeoutpython-requests

Timeout for python requests.get entire response


I'm gathering statistics on a list of websites and I'm using requests for it for simplicity. Here is my code:

data=[]
websites=['http://google.com', 'http://bbc.co.uk']
for w in websites:
    r= requests.get(w, verify=False)
    data.append( (r.url, len(r.content), r.elapsed.total_seconds(), str([(l.status_code, l.url) for l in r.history]), str(r.headers.items()), str(r.cookies.items())) )

Now, I want requests.get to timeout after 10 seconds so the loop doesn't get stuck.

This question has been of interest before too but none of the answers are clean.

I hear that maybe not using requests is a good idea but then how should I get the nice things requests offer (the ones in the tuple).


Solution

  • What about using eventlet? If you want to timeout the request after 10 seconds, even if data is being received, this snippet will work for you:

    import requests
    import eventlet
    eventlet.monkey_patch()
    
    with eventlet.Timeout(10):
        requests.get("http://ipv4.download.thinkbroadband.com/1GB.zip", verify=False)