para este código:cómo habilitar las solicitudes modo asíncrono?
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)
este resultado:
by requests: 18.3397213892 seconds
by urllib2: 2.48605842363 seconds
en sniffer se ve esto:
Descripción: 5 primeras solicitudes se sended por la biblioteca peticiones, próximos 5 solicitudes son enviado por la biblioteca urllib2. rojo - es el momento en que el trabajo fue congelado, oscuro - cuando se reciben los datos ... wtf ?!
¿Cómo es posible si la biblioteca de socket parcheada y las bibliotecas deben funcionar de forma idéntica? ¿Cómo se utilizan las solicitudes sin requests.async para el trabajo asincrónico?
Puede explicar su problema un poco más lejos? ¿Por qué no quieres usar el módulo requests.async? – Phani
Las solicitudes no funcionan de manera asincrónica. ¿Por qué? No quiero usar requests.async porque contiene una mala interfaz para usar y tampoco funciona asincrónica. Mire la imagen, se ve cómo solicitudes de trabajo y urllib2. – user1239798
Ver http://stackoverflow.com/questions/9110593/asynchronous-requests-with-python-requests y https://github.com/kennethreitz/grequests. –