En quoi est grequests asynchrone?
J'ai été en utilisant le python demandes de la bibliothèque pendant un certain temps, et a récemment eu besoin de faire une demande de façon asynchrone, ce qui signifie que je voudrais envoyer la requête HTTP, mon thread principal de continuer à exécuter, et ont une fonction de callback appelée lorsque la demande de retour.
Naturellement, j'ai été amené à le grequests bibliothèque (https://github.com/kennethreitz/grequests), mais je suis confus sur le comportement. Par exemple:
import grequests
def print_res(res):
from pprint import pprint
pprint (vars(res))
req = grequests.get('http://www.codehenge.net/blog', hooks=dict(response=print_res))
res = grequests.map([req])
for i in range(10):
print i
Le code ci-dessus produira la sortie suivante:
<...large HTTP response output...>
0
1
2
3
4
5
6
7
8
9
La grequests.map() appel de toute évidence des blocs jusqu'à ce que la réponse HTTP est disponible. Il semble probable que j'ai mal compris le "asynchrone" comportement ici, et le grequests bibliothèque est juste pour l'exécution de plusieurs requêtes HTTP simultanément et envoyer toutes les réponses à un seul rappel. Est-ce exact?
- Pas sûr, mais vous ne pourriez pas vous suffit d'utiliser le haut-
urllib
module et l'exécuter dans un thread d'arrière-plan avec lathread
module? - Je crois que j'ai à faire. J'étais dans la confusion, et que vous voulez vérifier le comportement attendu.
- Assurez-vous. J'ai juste tendance à coller avec built-ins, si possible, afin de maximiser la portabilité.
Vous devez vous connecter pour publier un commentaire.
.map()
est destinée à exécuter la récupération de plusieurs Url en parallèle, et en effet attendre que ces tâches à accomplir (gevent.joinall(jobs)
) est appelée).Utilisation
.send()
au lieu de pondre des emplois, à l'aide d'unPiscine
exemple:Sans la piscine, le
.send()
appel se bloque toujours, mais seulement pour lesgevent.spawn()
appel il s'exécute.grequests.post()
à la place? Aussi loin quegrequests
, il n'y a pas de différence entre la demande de diverses méthodes.Si vous ne souhaitez pas utiliser
grequests
vous pouvez simplement mettre en œuvre les demandes avec des rappels à l'aide derequests
+ lethreading
module de la bibliothèque standard. C'est en fait très facile, et si tout ce que vous voulez faire est d'envoyer des requêtes avec des rappels de l'API est plus agréable que celui fourni pargrequests
.Vous pouvez vérifier que cela fonctionne comme une appels AJAX en JS: vous envoyer une demande sur un autre thread, faire des trucs sur le thread principal, et si la requête retourne, vous appelez une fonction de rappel. Ce rappel se contente d'afficher le contenu de la réponse.
Créer une liste de demandes et de les envoyer ensuite avec
.imap
:session
estrequests.Session()
objet (facultatif)size=5
envoyer 5 requêtes en même temps: dès que l'un d'entre eux est terminée, la prochaine est envoyé