Python Demande: N'attendez pas pour demander à terminer
En Bash, il est possible d'exécuter une commande en arrière-plan en ajoutant &
. Comment puis-je le faire en Python?
while True:
data = raw_input('Enter something: ')
requests.post(url, data=data) # Don't wait for it to finish.
print('Sending POST request...') # This should appear immediately.
Contrairement au CPU des problèmes de concurrence, en Python, cela pourrait être résolu avec un thread séparé, ou l'utilisation de
multiprocessing.dummy
pour un pool de threads.OriginalL'auteur octosquidopus | 2014-11-19
Vous devez vous connecter pour publier un commentaire.
- Je utiliser
multiprocessing.dummy.Pool
. J'ai créer un singleton pool de threads au niveau du module, et ensuite utiliserpool.apply_async(requests.get, [params])
pour lancer la tâche.Cette commande me donne un avenir qui, je peux l'ajouter à une liste avec d'autres futures indéfiniment jusqu'à ce que je voudrais récupérer la totalité ou certains des résultats.
multiprocessing.dummy.Pool
est, contre toute logique et de la raison, un pool de THREADS et non pas un processus de piscine.Exemple (travaux en Python 2 et 3, tant que la demande est installé):
Les requêtes sont exécutées simultanément, de sorte que l'exécution de l'ensemble des dix de ces demandes ne doivent pas prendre plus que la plus longue. Cette stratégie permettra d'utiliser un seul cœur de PROCESSEUR, mais cela ne devrait pas être un problème parce que presque tous le temps sera passé à attendre pour les I/O.
ajout d'un exemple de réponse
Ton exemple fonctionne bien, mais ce n'est pas exactement ce que je suis en train de faire. Au lieu d'envoyer des demandes simultanées, je voudrais leur en envoyer un à la fois, mais sans bloquer le reste du code. Mon exemple devrait être maintenant être moins ambigu.
Je pense que la mise en forme doit être
pool.apply_async(requests.post, [url], {'data': data})
. La signature de la fonction est essentiellement (function_to_run, list_of_positional_args, dict_of_kwargs).r
n'est pas un objet de réponse, c'est un avenir pour un objet de réponse. Vous obtenez la vraie réponse avecr.get()
-- qui produit un objet response qui est le même que toute autre. Si vous voulez seulement le code de statut que vous pourriez fairer.get().status_code
(à noter que si la demande a entraîné une exception, l'exception sera levée lorsque vous appelezget()
). Vous pouvez également faireresponse = r.get()
et procéder comme d'habitude. Si vousr.get()
avant la requête asynchrone est terminée, alors vous aurez automatiquement attendre jusqu'à ce que la demande est complète avant de procéder.OriginalL'auteur Andrew Gorcester
Voici un hacky façon de le faire:
fonctionne bien quand on n'a pas besoin de la réponse de l'api
OriginalL'auteur keithhackbarth
Selon la doc, vous devez les déplacer vers une autre bibliothèque :
csrf = s.cookies['csrftoken']
.OriginalL'auteur Romain Jouin
Si vous pouvez écrire le code à exécuter séparément dans un autre programme en python, ici est une solution basée sur subprocessing.
Sinon, vous pourriez trouver utiles cette question et liées réponse: l'astuce est d'utiliser le filetage de la bibliothèque pour démarrer un thread à exécuter la séparation de la tâche.
Une mise en garde à la fois de l'approche pourrait être le nombre d'éléments (c'est-à-dire le nombre de threads), vous avez à gérer. Si le
item
s dansparent
sont trop nombreux, vous pouvez envisager l'arrêt de chaque lot d'articles jusqu'à au moins certains threads ont fini, mais je pense que ce type de gestion est non-trivial.Pour une approche plus sophistiquée, vous pouvez utiliser un acteur en fonction de l'approche, je n'ai pas utilisé cette bibliothèque moi, mais je pense que ça pourrait aider dans ce cas.
OriginalL'auteur Chosmos
Solution élégante de Andrew Gorcester. En outre, sans l'aide de contrats à terme, il est possible d'utiliser les
callback
eterror_callback
attributs (voirdoc) afin d'effectuer un traitement asynchrone:
OriginalL'auteur Nemolovich