Je n'avais pas de bon exemple de code pour ʻasyncio`, mais Données à la demande en Python, Partie 3 Corroutine et asyncio -on-demand-data-python-3 / index.html) expliqué avec une histoire plus spécifique que le serveur du restaurant gère plusieurs commandes, c'est donc le plus facile à comprendre et utile. .. Fréquemment vu Understanding async / await in python3 et [Asynchronous processing in Python: asyncio reverse reference](https://qiita.com/icoxfog417/ Mieux que les articles / 07cbf5110ca82629aca0).
import asyncio
import time
async def start_time(src):
await asyncio.sleep(src)
print("START!!!")
async def main_process(span):
idx = 1
while True:
await asyncio.sleep(span)
num_active_tasks = len([ task for task in asyncio.Task.all_tasks(loop) if not task.done()])
if num_active_tasks == 1:
break
print("[run:{}]{}Les secondes ont passé".format(num_active_tasks, idx * span))
idx += 1
async def end_time(src):
await asyncio.sleep(src)
print("END!!!")
if __name__ == "__main__":
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(
asyncio.gather(
start_time(10),
main_process(1),
end_time(20)
)
)
finally:
loop.close()
Le point d'intérêt est
len([ task for task in asyncio.Task.all_tasks(loop) if not task.done()])
Vous pouvez obtenir les tâches actuellement résidentes en faisant ʻasyncio.Task.all_tasks (loop) sinon task.done () `.
Le résultat de sortie est le suivant. Si seul le processus principal est en cours d'exécution, il est hors de la boucle.
[run:3]1 seconde passée
[run:3]2 secondes se sont écoulées
[run:3]3 secondes se sont écoulées
[run:3]4 secondes se sont écoulées
[run:3]5 secondes se sont écoulées
[run:3]6 secondes se sont écoulées
[run:3]7 secondes se sont écoulées
[run:3]8 secondes passées
[run:3]9 secondes passées
START!!!
[run:2]10 secondes se sont écoulées
[run:2]11 secondes se sont écoulées
[run:2]12 secondes se sont écoulées
[run:2]13 secondes passées
[run:2]14 secondes passées
[run:2]15 secondes se sont écoulées
[run:2]16 secondes passées
[run:2]17 secondes passées
[run:2]18 secondes passées
[run:2]19 secondes se sont écoulées
END!!!
ʻAsyncio.Task.all_tasks () est obsolète dans Python 3.7 et versions ultérieures et sera supprimé dans la version 3.9. Surtout dans la partie de ʻasyncio
, le style d'écriture semble changer considérablement à chaque fois que la version monte.
(Voir Objet de tâche doc Python3.8)
Recommended Posts