J'ai essayé l'exemple fourni dans la documentation de la bibliothèque de requêtes pour python.
Avec async.map(rs)
, j'obtiens les codes de réponse, mais je souhaite obtenir le contenu de chaque page demandée. Cela, par exemple, ne fonctionne pas:
out = async.map(rs)
print out[0].content
requests-threads
existe maintenant.Réponses:
Remarque
La réponse ci-dessous ne s'applique pas aux demandes v0.13.0 +. La fonctionnalité asynchrone a été déplacée vers les grequests après la rédaction de cette question. Cependant, vous pouvez simplement remplacer
requests
pargrequests
ci-dessous et cela devrait fonctionner.J'ai laissé cette réponse telle quelle pour refléter la question d'origine qui portait sur l'utilisation des requêtes <v0.13.0.
Pour effectuer plusieurs tâches de
async.map
manière asynchrone, vous devez:async.map
sur une liste de toutes les demandes / actionsExemple:
la source
from grequests import async
ne fonctionne pas .. et cette définition de dosomething fonctionne pour moidef do_something(response, **kwargs):
, je la trouve sur stackoverflow.com/questions/15594015/…from requests import async
par aimport grequests as async
fonctionné pour moi.async
est maintenant un module indépendant:grequests
.Voir ici: https://github.com/kennethreitz/grequests
Et là: Méthode idéale pour envoyer plusieurs requêtes HTTP via Python?
installation:
usage:
construire une pile:
envoyer la pile
le résultat ressemble à
Les grequests ne semblent pas définir de limitation pour les requêtes simultanées, c'est-à-dire lorsque plusieurs requêtes sont envoyées au même serveur.
la source
results = grequests.map(rs)
le code après que cette ligne soit bloqué, je peux voir l'effet asynchrone?J'ai testé à la fois les requêtes-futures et les grequests . Grequests est plus rapide mais apporte des correctifs de singe et des problèmes supplémentaires avec les dépendances. requêtes-futurs est plusieurs fois plus lent que les grequests. J'ai décidé d'écrire mes propres requêtes simplement encapsulées dans ThreadPoolExecutor et c'était presque aussi rapide que les grequests, mais sans dépendances externes.
la source
peut - être que les demandes d'avenir sont un autre choix.
Il est également recommandé dans le document du bureau . Si vous ne voulez pas impliquer gevent, c'est une bonne solution.
la source
ThreadPoolExecutor(max_workers=10)
J'ai beaucoup de problèmes avec la plupart des réponses publiées - soit elles utilisent des bibliothèques obsolètes qui ont été portées avec des fonctionnalités limitées, soit fournissent une solution avec trop de magie sur l'exécution de la demande, ce qui rend difficile la gestion des erreurs. S'ils n'entrent pas dans l'une des catégories ci-dessus, ce sont des bibliothèques tierces ou obsolètes.
Certaines des solutions fonctionnent bien uniquement dans les requêtes http, mais les solutions sont insuffisantes pour tout autre type de requête, ce qui est ridicule. Une solution hautement personnalisée n'est pas nécessaire ici.
Le simple fait d'utiliser la bibliothèque intégrée python
asyncio
est suffisant pour effectuer des requêtes asynchrones de tout type, ainsi que pour fournir suffisamment de fluidité pour la gestion des erreurs complexes et spécifiques à des cas d'utilisation.Comment cela fonctionne est simple. Vous créez une série de tâches que vous souhaitez exécuter de manière asynchrone, puis vous demandez à une boucle d'exécuter ces tâches et de quitter à la fin. Pas de bibliothèques supplémentaires soumises à un manque de maintenance, aucun manque de fonctionnalités requises
la source
async
. Ensuite, vous pouvez par exemple faireawait response = requests.get(URL)
. Non?requests
est à peine plus rapide (et dans certains cas plus lent) que d'appeler simplement une liste d'URL de manière synchrone. Par exemple, demander un point de terminaison qui prend 3 secondes pour répondre 10 fois en utilisant la stratégie ci-dessus prend environ 30 secondes. Si vous voulez de vraiesasync
performances, vous devez utiliser quelque chose commeaiohttp
.run_until_complete
- c'est à moins que vous n'utilisiez le module de threading, qui délègue l'async à la couche OS. Lisez le problème GIL en python pour plus d'informationsrequests.get
. Mais la question est de savoir comment effectuer des requêtes asynchrones avec larequests
bibliothèque python . Cette réponse ne fait pas cela, donc ma critique tient.Je sais que cela a été fermé pendant un certain temps, mais j'ai pensé qu'il pourrait être utile de promouvoir une autre solution asynchrone basée sur la bibliothèque de requêtes.
Les documents sont ici: http://pythonhosted.org/simple-requests/
la source
la source
Si vous souhaitez utiliser asyncio,
requests-async
fournit la fonctionnalité async / await pourrequests
- https://github.com/encode/requests-asyncla source
J'utilise des requêtes python pour les appels asynchrones contre l'API gist de github depuis un certain temps.
Pour un exemple, consultez le code ici:
https://github.com/davidthewatson/flasgist/blob/master/views.py#L60-72
Ce style de python n'est peut-être pas l'exemple le plus clair, mais je peux vous assurer que le code fonctionne. Faites-moi savoir si cela vous dérange et je vais le documenter.
la source
Vous pouvez utiliser
httpx
pour cela.si vous voulez une syntaxe fonctionnelle, la lib gamla englobe cela
get_async
.Alors tu peux faire
Le
10
est le délai en secondes.(avertissement: je suis son auteur)
la source
respx
pour se moquer / tester :)J'ai également essayé certaines choses en utilisant les méthodes asynchrones en python, mais j'ai eu beaucoup plus de chance en utilisant Twisted pour la programmation asynchrone. Il a moins de problèmes et est bien documenté. Voici un lien entre quelque chose de similaire à ce que vous essayez de tordu.
http://pythonquirks.blogspot.com/2011/04/twisted-asynchronous-http-request.html
la source
Malheureusement, pour autant que je sache, la bibliothèque de requêtes n'est pas équipée pour effectuer des requêtes asynchrones. Vous pouvez encapsuler la
async/await
syntaxerequests
, mais cela ne rendra pas les requêtes sous-jacentes moins synchrones. Si vous voulez de vraies requêtes asynchrones, vous devez utiliser d'autres outils qui les fournissent. Une de ces solutions estaiohttp
(Python 3.5.3+). Cela fonctionne bien d'après mon expérience de son utilisation avec laasync/await
syntaxe Python 3.7 . Ci-dessous, j'écris trois implémentations de l'exécution de n requêtes Web en utilisantsync_requests_get_all
) utilisant larequests
bibliothèque Pythonasync_requests_get_all
) utilisant larequests
bibliothèque Python encapsulée dans laasync/await
syntaxe Python 3.7 etasyncio
async_aiohttp_get_all
) avec laaiohttp
bibliothèque Python enveloppée dans laasync/await
syntaxe Python 3.7 etasyncio
Sur ma machine, voici la sortie:
la source