Как указал Кеннет, еще одна вещь, которую мы можем сделать, - позволить модулю requests
обрабатывать асинхронную часть. Я внес изменения в ваш код соответственно. Опять же, для меня результаты показывают, что модуль requests
работает лучше, чем urllib2
Это означает, что мы не можем «потянуть» часть обратного вызова. Но это должно быть хорошо, потому что основной выигрыш следует ожидать только с HTTP-запросами из-за задержки запроса / ответа.
import sys
import gevent
from gevent import monkey
monkey.patch_all()
import requests
from requests import async
import urllib2
def call_back(resp):
content = resp.content
title = content.split('<title>')[1].split('</title>')[0].strip()
return title
def worker(url, use_urllib2=False):
if use_urllib2:
content = urllib2.urlopen(url).read().lower()
title = content.split('<title>')[1].split('</title>')[0].strip()
else:
rs = [async.get(u) for u in url]
resps = async.map(rs)
for resp in resps:
call_back(resp)
urls = ['http://www.mail.ru']*5
def by_requests():
worker(urls)
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: 2.44117593765 seconds
by urllib2: 4.41298294067 seconds