как включить асинхронный режим запросов?

для этого кода:

import sys

import gevent
from gevent import monkey

monkey.patch_all()

import requests
import urllib2

def worker(url, use_urllib2=False):
    if use_urllib2:
        content = urllib2.urlopen(url).read().lower()
    else:
        content = requests.get(url, prefetch=True).content.lower()
    title = content.split('<title>')[1].split('</title>')[0].strip()

urls = ['http://www.mail.ru']*5

def by_requests():
    jobs = [gevent.spawn(worker, url) for url in urls]
    gevent.joinall(jobs)

def by_urllib2():
    jobs = [gevent.spawn(worker, url, True) for url in urls]
    gevent.joinall(jobs)

if __name__=='__main__':
    from timeit import Timer
    t = Timer(stmt="by_requests()", setup="from __main__ import by_requests")  
    print 'by requests: %s seconds'%t.timeit(number=3)
    t = Timer(stmt="by_urllib2()", setup="from __main__ import by_urllib2")  
    print 'by urllib2: %s seconds'%t.timeit(number=3)
    sys.exit(0)

этот результат:

by requests: 18.3397213892 seconds
by urllib2: 2.48605842363 seconds

в сниффере это выглядит так:

описание: первые 5 запросов отправляются библиотекой запросов, следующие 5 запросов отправляются библиотекой urllib2. красный - время, когда работа зависла, темный - время приема данных... wtf?!

Как это возможно, если библиотека сокетов исправлена ​​и библиотеки должны работать одинаково? Как использовать запросы без request.async для асинхронной работы?

17
задан Jeremy Banks 25 November 2012 в 07:30
поделиться