Wie kann ich mit dem Asyncio-Modul von Python gleichzeitig ausgeführte Aufgaben ordnungsgemäß erstellen und ausführen?

ch versuche, zwei gleichzeitig laufende Programme richtig zu verstehen und zu implementiereTask Objekte mit Python 3's relativ neuemasyncio module.

urz gesagt, scheint asyncio darauf ausgelegt zu sein, asynchrone Prozesse und gleichzeitigeTask Ausführung über eine Ereignisschleife. Es fördert die Verwendung vonawait (angewendet in asynchronen Funktionen) als ruffreie Möglichkeit, auf ein Ergebnis zu warten und es zu verwenden, ohne die Ereignisschleife zu blockieren. (Futures und Callbacks sind nach wie vor eine gangbare Alternative.)

s bietet auch dieasyncio.Task() class, eine spezialisierte Unterklasse vonFuture Zum Umwickeln von Coroutinen. Vorzugsweise mit dem @ aufgerufasyncio.ensure_future() Methode. Die beabsichtigte Verwendung von Asyncio-Tasks besteht darin, dass unabhängig ausgeführte Tasks gleichzeitig mit anderen Tasks in derselben Ereignisschleife ausgeführt werden können. Mein Verständnis ist, dassTasks sind mit der Ereignisschleife verbunden, die die Coroutine dann automatisch zwischenawait Anweisungen.

Ich mag die Idee, gleichzeitige Tasks verwenden zu können, ohne eines der @ -Zeichen verwenden zu müsseExecutor Klassen, aber ich habe nicht viel Details zur Implementierung gefunden.

So mache ich es gerade:

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()

Bei dem Versuch, zwei Loop-Tasks gleichzeitig auszuführen, ist mir aufgefallen, dass die Task kein internes @ haawait Ausdruck, es wird im @ stecken bleibwhile loop, wodurch die Ausführung anderer Tasks effektiv blockiert wird (ähnlich wie bei einem normalenwhile loop). Sobald die Tasks jedoch warten müssen, scheinen sie ohne Probleme gleichzeitig ausgeführt zu werden.

Und so kam es dass derawait -Anweisungen bieten der Ereignisschleife anscheinend die Möglichkeit, zwischen den Tasks hin und her zu wechseln, was den Effekt der gleichzeitigen Ausführung hat.

Beispielausgabe mit internemawait:

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

Beispielausgabeohn internalawait:

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

Durchläuft diese Implementierung ein 'richtiges' Beispiel für Aufgaben mit gleichzeitiger Schleife inasyncio?

Ist es richtig, dass dies nur für ein @ funktionierTask, um einen Blockierungspunkt anzugeben await Ausdruck), damit die Ereignisschleife mehrere Aufgaben unter einen Hut bringt?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage