Probé la muestra proporcionada en la documentación de la biblioteca de solicitudes para python.
Con async.map(rs)
, obtengo los códigos de respuesta, pero quiero obtener el contenido de cada página solicitada. Esto, por ejemplo, no funciona:
out = async.map(rs)
print out[0].content
requests-threads
existe ahora.Respuestas:
Nota
La siguiente respuesta no es aplicable a las solicitudes v0.13.0 +. La funcionalidad asincrónica se trasladó a grequests después de escribir esta pregunta. Sin embargo, podría reemplazar
requests
con elgrequests
siguiente y debería funcionar.He dejado esta respuesta como para reflejar la pregunta original sobre el uso de solicitudes <v0.13.0.
Para realizar múltiples tareas de
async.map
forma asincrónica debes:async.map
a una lista de todas las solicitudes / accionesEjemplo:
fuente
from grequests import async
no funciona ... y esta definición de algo me funcionadef do_something(response, **kwargs):
, lo encuentro en stackoverflow.com/questions/15594015/…from requests import async
porimport grequests as async
trabajado para mí.async
es ahora un módulo independiente:grequests
.Ver aquí: https://github.com/kennethreitz/grequests
Y allí: ¿ Método ideal para enviar múltiples solicitudes HTTP a través de Python?
instalación:
uso:
construir una pila:
envía la pila
el resultado parece
grequests no parece establecer una limitación para las solicitudes concurrentes, es decir, cuando se envían varias solicitudes al mismo servidor.
fuente
results = grequests.map(rs)
el código después de esta línea sea bloqueado, ¿puedo ver el efecto asíncrono?Probé ambas solicitudes de futuros y grequests . Grequests es más rápido pero trae parches de mono y problemas adicionales con las dependencias. request-futuros es varias veces más lento que grequests. Decidí escribir mis propias solicitudes y simplemente envolverlas en ThreadPoolExecutor y fue casi tan rápido como grequests, pero sin dependencias externas.
fuente
tal vez las solicitudes de futuros es otra opción.
También se recomienda en el documento de la oficina . Si no quieres involucrar a gevent, es bueno.
fuente
ThreadPoolExecutor(max_workers=10)
Tengo muchos problemas con la mayoría de las respuestas publicadas: o usan bibliotecas obsoletas que se han portado con funciones limitadas o proporcionan una solución con demasiada magia en la ejecución de la solicitud, lo que dificulta el manejo de errores. Si no entran en una de las categorías anteriores, son bibliotecas de terceros o están en desuso.
Algunas de las soluciones funcionan bien únicamente en solicitudes http, pero las soluciones se quedan cortas para cualquier otro tipo de solicitud, lo cual es ridículo. Aquí no es necesaria una solución altamente personalizada.
El simple uso de la biblioteca incorporada de Python
asyncio
es suficiente para realizar solicitudes asíncronas de cualquier tipo, además de proporcionar suficiente fluidez para el manejo de errores complejos y de casos de uso específicos.El funcionamiento es simple. Está creando una serie de tareas que le gustaría que ocurrieran de forma asíncrona y luego solicita un ciclo para ejecutar esas tareas y salir al finalizar. No hay bibliotecas adicionales sujetas a falta de mantenimiento, no se requiere falta de funcionalidad.
fuente
async
. Entonces puedes, por ejemplo, hacerawait response = requests.get(URL)
. ¿No?requests
es apenas más rápido (y en algunos casos más lento) que simplemente llamar una lista de URL sincrónicamente. Por ejemplo, solicitar un punto final que demore 3 segundos en responder 10 veces usando la estrategia anterior toma aproximadamente 30 segundos. Si quieres unasync
rendimiento real , necesitas usar algo comoaiohttp
.Sé que esto ha estado cerrado por un tiempo, pero pensé que podría ser útil promover otra solución asíncrona construida en la biblioteca de solicitudes.
Los documentos están aquí: http://pythonhosted.org/simple-requests/
fuente
fuente
Si desea usar asyncio,
requests-async
proporciona la funcionalidad async / wait pararequests
: https://github.com/encode/requests-asyncfuente
He estado usando solicitudes de python para llamadas asíncronas contra la API de Github durante algún tiempo.
Para ver un ejemplo, vea el código aquí:
https://github.com/davidthewatson/flasgist/blob/master/views.py#L60-72
Este estilo de python puede no ser el ejemplo más claro, pero puedo asegurarle que el código funciona. Avíseme si esto le resulta confuso y lo documentaré.
fuente
Puedes usar
httpx
para eso.si desea una sintaxis funcional, la gamla lib lo envuelve
get_async
.Entonces puedes hacer
El
10
es el tiempo de espera en segundos.(descargo de responsabilidad: soy su autor)
fuente
respx
para burlarse / probar :)También he intentado algunas cosas usando los métodos asincrónicos en Python, sin embargo, he tenido mucha mejor suerte usando Twisted para la programación asincrónica. Tiene menos problemas y está bien documentado. Aquí hay un enlace de algo similar a lo que está intentando retorcer.
http://pythonquirks.blogspot.com/2011/04/twisted-asynchronous-http-request.html
fuente