Comment créer et exécuter des tâches simultanées à l'aide de python module asyncio?

Je suis en train d'essayer de bien comprendre et de mettre en œuvre deux simultanément en cours d'exécution Tâche objets à l'aide de Python 3 est relativement nouveau asyncio module.

En un mot, asyncio semble avoir été conçu pour gérer le processus asynchrones et simultanées Task exécution sur une boucle d'événements. Il encourage l'utilisation de await (appliquée dans async fonctions) comme un rappel sans attendre et utiliser un résultat, sans blocage de la boucle d'événements. (Contrats à terme et les rappels sont toujours une alternative viable.)

Il fournit également le asyncio.Task() classe, spécialisé de la sous-classe de Future conçu pour envelopper coroutines. De préférence, invoquée par l'aide de la asyncio.ensure_future() méthode. L'utilisation prévue de asyncio tâches est de permettre indépendamment l'exécution de tâches à exécuter simultanément avec les autres tâches au sein de la même boucle d'événements. Ma compréhension est que Tasks sont connectés à la boucle d'événements qui automatiquement de maintenir la coroutine entre await consolidés.

J'aime l'idée d'être en mesure de l'utilisation simultanée de Tâches, sans avoir besoin d'utiliser l'un des Exécuteur classes, mais je n'ai pas trouvé trop de détails sur la mise en œuvre.

C'est de cette façon que je suis en train de le faire:

import asyncio

print('running async test')

async def say_boo():
    i = 0
    while True:
        await asyncio.sleep(0)
        print('...boo {0}'.format(i))
        i += 1

async def say_baa():
    i = 0
    while True:
        await asyncio.sleep(0)
        print('...baa {0}'.format(i))
        i += 1

# wrap in Task object
# -> automatically attaches to event loop and executes
boo = asyncio.ensure_future(say_boo())
baa = asyncio.ensure_future(say_baa())

loop = asyncio.get_event_loop()
loop.run_forever()

Dans le cas d'essayer d'exécuter simultanément deux boucle Tâches, j'ai remarqué que, à moins que la Tâche a un interne await expression, il sera coincé dans le while boucle, bloquant d'autres tâches de s'exécuter (un peu comme une normale while boucle). Cependant, dès Tâches (a)attendre, ils semblent fonctionner simultanément sans problème.

Ainsi, la await déclarations semblent offrir la boucle d'événement avec un point d'appui pour des allers-retours entre les tâches, ce qui donne l'effet de simultanéité.

Exemple de sortie interne await:

running async test
...boo 0
...baa 0
...boo 1
...baa 1
...boo 2
...baa 2

Exemple de sortie sans interne await:

...boo 0
...boo 1
...boo 2
...boo 3
...boo 4

Questions

Est-ce à la mise en œuvre de passer pour un " bon " exemple de connexions simultanées en boucle Tâches dans asyncio?

Est-il exact que la seule façon dont cela fonctionne est pour un Task de fournir un point de blocage (await expression) pour que la boucle d'événement de jongler avec plusieurs tâches?

  • Oui, la tâche atomiquement exécute lui-même à partir de yield from à la prochaine yield from.
InformationsquelleAutor songololo | 2015-03-26