Eu tentei a amostra fornecida na documentação da biblioteca de solicitações para python.
Com async.map(rs)
, recebo os códigos de resposta, mas quero obter o conteúdo de cada página solicitada. Isso, por exemplo, não funciona:
out = async.map(rs)
print out[0].content
requests-threads
existe agora.Respostas:
Nota
A resposta abaixo não é aplicável aos pedidos v0.13.0 +. A funcionalidade assíncrona foi movida para grequests depois que essa pergunta foi escrita. No entanto, você pode simplesmente substituir
requests
porgrequests
abaixo e deve funcionar.Eu deixei esta resposta como é para refletir a pergunta original que era sobre o uso de solicitações <v0.13.0.
Para executar várias tarefas de
async.map
forma assíncrona, é necessário:async.map
uma lista de todos os pedidos / açõesExemplo:
fonte
from grequests import async
não funciona .. e esta definição de algo funciona para mimdef do_something(response, **kwargs):
, acho-a de stackoverflow.com/questions/15594015/…from requests import async
porimport grequests as async
funcionou para mim.async
agora é um módulo independente:grequests
.Veja aqui: https://github.com/kennethreitz/grequests
E aí: Método ideal para enviar várias solicitações HTTP através de Python?
instalação:
uso:
construa uma pilha:
envie a pilha
resultado parece
grequests não parecem definir uma limitação para solicitações simultâneas, ou seja, quando várias solicitações são enviadas para o mesmo servidor.
fonte
results = grequests.map(rs)
o código após esta linha ser bloqueada, posso ver o efeito assíncrono?Eu testei os pedidos de futuros e grequests . O Grequests é mais rápido, mas traz o patch para macacos e problemas adicionais com as dependências. orders-futures é várias vezes mais lento que grequests. Decidi escrever minhas próprias solicitações e simplesmente encapsulá-las no ThreadPoolExecutor, e era quase tão rápido quanto as grequests, mas sem dependências externas.
fonte
talvez pedidos-futuros seja outra opção.
Também é recomendado no documento do escritório . Se você não quer envolver gevent, é uma boa.
fonte
ThreadPoolExecutor(max_workers=10)
Eu tenho muitos problemas com a maioria das respostas postadas - eles usam bibliotecas obsoletas que foram portadas com recursos limitados ou fornecem uma solução com muita mágica na execução da solicitação, dificultando a manipulação de erros. Se eles não se enquadram em uma das categorias acima, são bibliotecas de terceiros ou estão obsoletas.
Algumas das soluções funcionam bem puramente em solicitações http, mas as soluções ficam aquém de qualquer outro tipo de solicitação, o que é ridículo. Uma solução altamente personalizada não é necessária aqui.
Simplesmente usar a biblioteca
asyncio
interna python é suficiente para executar solicitações assíncronas de qualquer tipo, além de fornecer fluidez suficiente para manipulação de erros complexa e específica de uso do usuário.Como funciona é simples. Você está criando uma série de tarefas que gostaria de ocorrer de forma assíncrona e solicitando um loop para executar essas tarefas e sair após a conclusão. Nenhuma biblioteca extra sujeita a falta de manutenção, não há funcionalidade necessária.
fonte
async
. Então você pode, por exemplo, fazerawait response = requests.get(URL)
. Não?requests
é pouco mais rápido (e, em alguns casos, mais lento) do que chamar uma lista de URLs de forma síncrona. Por exemplo, solicitar um ponto de extremidade que leva 3 segundos para responder 10 vezes usando a estratégia acima leva cerca de 30 segundos. Se você quer umasync
desempenho verdadeiro , precisa usar algo parecidoaiohttp
.Sei que isso foi encerrado por um tempo, mas achei que poderia ser útil promover outra solução assíncrona criada na biblioteca de solicitações.
Os documentos estão aqui: http://pythonhosted.org/simple-requests/
fonte
fonte
Se você deseja usar o assíncrono,
requests-async
fornece a funcionalidade assíncrona / aguardada pararequests
- https://github.com/encode/requests-asyncfonte
Estou usando solicitações python para chamadas assíncronas contra a API gistub do github há algum tempo.
Para um exemplo, veja o código aqui:
https://github.com/davidthewatson/flasgist/blob/master/views.py#L60-72
Esse estilo de python pode não ser o exemplo mais claro, mas posso garantir que o código funciona. Deixe-me saber se isso é confuso para você e eu o documentarei.
fonte
Você pode usar
httpx
para isso.se você quer uma sintaxe funcional, a gamla lib envolve isso
get_async
.Então você pode fazer
O
10
tempo limite é em segundos.(aviso: sou o autor)
fonte
respx
para zombar / testar :)Eu também tentei algumas coisas usando os métodos assíncronos em python, como sempre tive uma sorte muito melhor usando o twisted para programação assíncrona. Tem menos problemas e está bem documentado. Aqui está um link de algo semelhante ao que você está tentando distorcer.
http://pythonquirks.blogspot.com/2011/04/twisted-asynchronous-http-request.html
fonte