comment ajouter une coroutine à l'exécution d'un asyncio boucle?
Comment peut-on ajouter un nouveau coroutine à l'exécution d'un asyncio boucle? C'est à dire. celui qui est déjà en cours d'exécution d'un ensemble de coroutines.
Je suppose que comme une solution de contournement, on pourrait attendre pour les coroutines à remplir et ensuite initialiser une nouvelle boucle (avec l'augmentation de la coroutine). Mais est-il une meilleure façon?
OriginalL'auteur Petri | 2015-12-28
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
create_task
pour la planification de nouvelles coroutines:main
crée la coroutine et la boucle commence après que. En d'autres termes, cet exemple d'horaires pour les coroutines avant la boucle a commencé. Ce qui n'est pas ce que j'ai demandé.main
est simplement là comme un wrapper; je voulais juste faire remarquerloop.create_task
'utilisation.create_task
fait exactement ce que vous voulez. -- J'ai édité l'exemple de préciser quemain
serait de les bloquer avant d'exécutercreate_task
.vous ne pouvez pas appeler
loop.run_until_complete()
, tandis que la boucle est en cours d'exécutionOriginalL'auteur Jashandeep Sohi
Pour ajouter une fonction à un événement en cours d'exécution de la boucle, vous pouvez utiliser:
asyncio.ensure_future(my_coro())
Dans mon cas, j'ai été en utilisant le multithreading (
threading
) aux côtés deasyncio
et je voulais ajouter une tâche à la boucle d'événements, qui était déjà en cours d'exécution. Pour quelqu'un d'autre dans la même situation, assurez-vous de préciser explicitement le cas de la boucle (en tant que l'un n'existe pas à l'intérieur d'unThread
). j'.e:Dans la portée globale:
Puis, plus tard, à l'intérieur de votre
Thread
:OriginalL'auteur Dotl
Votre question est très proche de "Comment faire pour ajouter un appel de fonction à l'exécution du programme?"
Quand exactement vous devez ajouter de nouvelles coroutine à la boucle d'événements?
Nous allons voir quelques exemples. Ici programme qui commence à boucle, avec deux coroutines parallèlement:
De sortie:
Peut-être vous avez besoin d'ajouter un peu de coroutines qui permettrait de prendre les résultats de
coro1
et de l'utiliser dès qu'il est prêt? Dans ce cas, il suffit de créer coroutine qui attendentcoro1
et à l'utilisation c'est le retour de la valeur:De sortie:
Penser coroutines que sur les fonctions spécifiques de la syntaxe. Vous pouvez commencer à un ensemble de fonctions à exécuter parallèlement (par
asyncio.gather
), vous pouvez démarrer la fonction suivante après la première fait, vous pouvez créer de nouvelles fonctions qui en appelle d'autres.OriginalL'auteur Mikhail Gerasimov
Aucune des réponses ici semblent exactement répondre à la question. Il est possible d'ajouter des tâches à un événement en cours d'exécution de la boucle par une "mère" de la tâche de le faire pour vous. Je ne suis pas sûr de ce que la plupart des pythonic façon de s'assurer que le parent n'a pas de fin jusqu'à ce que les enfants ont tous finis (en supposant que c'est le comportement que vous voulez), mais cela ne fonctionne pas.
OriginalL'auteur Adam