Ich habe vor kurzem mit asyncio herum Ausmisten, und während ich eine Intuition zu bekommen fange an, wie es funktioniert, ist es etwas, das ich habe zu tun, nicht in der Lage gewesen. Ich bin nicht sicher, ob es daran liegt, dass ich die Konstruktion falsch verstanden habe, oder wenn es einen Grund gibt, warum das, was ich versuche, keinen Sinn ergibt.Iterieren über asyncio.coroutine
Kurz gesagt, ich möchte in der Lage sein, ein Nachgeben asyncio.coroutine iterieren. Zum Beispiel würde Ich mag Lage sein, etwas zu tun:
@asyncio.coroutine
def countdown(n):
while n > 0:
yield from asyncio.sleep(1)
n = n - 1
yield n
@asyncio.coroutine
def do_work():
for n in countdown(5):
print(n)
loop.run_until_complete(do_work())
Allerdings wirft dies eine Ausnahme aus den Eingeweiden von asyncio. Ich habe andere Dinge ausprobiert, wie for n in (yield from countdown(5)): ...
, aber das gibt auch eine ähnlich undurchsichtige Laufzeit Ausnahme.
Ich kann nicht sofort sehen, warum Sie nicht so etwas tun sollte, aber ich bin an die Grenzen meiner Fähigkeit bekommen, zu verstehen, was los ist.
So:
- wenn es möglich ist, dies zu tun, wie kann ich es tun?
- wenn es nicht möglich ist, warum nicht?
Lassen Sie mich wissen, ob diese Frage nicht klar ist!
Das ist genial! Natürlich sollten wir Python 3.6 verwenden, wo Asyncgeneratoren nativ unterstützt werden, aber wenn Sie aus irgendeinem Grund zu Python 3.5 gezwungen werden, ist dies ein echtes Juwel. Es ist auch sehr ähnlich in der Syntax, wie Sie Async-Generatoren in 3.6 verwenden würden, so sollte der Übergang einfach sein, wenn es passiert. –
Wie kann ich verschachtelte Async-Generatoren auf diese Weise erstellen? Was wäre in Ihrem Beispiel, wenn 'do_work' selbst Ergebnisse liefern sollte? Wenn wir es mit '@ asynciter' anstatt mit' async def' versehen, können wir 'async for' natürlich nicht mehr verwenden. Wie iterieren wir über die Ergebnisse der inneren Coroutine? –
Eigentlich, vergiss es, ich habe entdeckt, dass es ein tolles Paket [async_generator] (https://pypi.python.org/pypi/async_generator/1.7) gibt, das all das schon macht! –