Ultimamente sto cazzeggiando con asyncio, e mentre sto iniziando a intuire come funziona, c'è qualcosa che non sono stato in grado di fare. Non sono sicuro se è perché ho sbagliato la costruzione, o se c'è una ragione per cui quello che sto cercando di fare non ha senso.Iterating over asyncio.coroutine
In breve, voglio essere in grado di scorrere su un asyncio.coroutine cedevole. Ad esempio, mi piacerebbe essere in grado di fare qualcosa di simile:
@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())
Tuttavia, questo genera un'eccezione dalle viscere della asyncio. Ho provato altre cose, come for n in (yield from countdown(5)): ...
ma ciò fornisce anche un'eccezione di runtime simile opaco.
Non riesco a capire immediatamente perché non dovresti fare qualcosa del genere, ma sto arrivando ai limiti della mia capacità di capire cosa sta succedendo.
Quindi:
- se è possibile farlo, come posso farlo?
- se non è possibile, perché no?
Fatemi sapere se questa domanda non è chiara!
Ciò è impressionante! Ovviamente dovremmo usare Pyhton 3.6 dove i generatori asincroni sono supportati nativamente, ma se sei costretto a usare Python 3.5 per qualsiasi motivo, questo è un vero gioiello. È anche molto simile nella sintassi al modo in cui useresti i generatori asincroni in 3.6, quindi la transizione dovrebbe essere facile quando succede. –
Come posso creare generatori asincroni nidificati in questo modo? Nel tuo esempio, cosa succede se 'do_work' stesso dovrebbe produrre risultati? Se lo decoriamo con '@ asynciter' invece di usare' async def', ovviamente non possiamo più usare 'async for'. Come facciamo a ripetere i risultati della coroutine interna? –
In realtà, non importa, ho scoperto che c'è un fantastico pacchetto [async_generator] (https://pypi.python.org/pypi/async_generator/1.7) che fa già tutto questo! –