Если взять обычные генераторы, то реализовать подобное просто:
def g():
yield 1
some_actions()
yield 2
more_actions()
...
yield 42
for result in g():
print(result)
Плюс, можно через send() отправлять в такой генератор значения, например так:
def g():
v = 0
while True:
v = yield v * 2
if v > 100:
break
gen = g()
next(gen)
r = 1
l = []
while True:
try:
r = gen.send(r)
l.append(r)
except StopIteration:
break
# l -> [2, 4, 8, 16, 32, 64, 128]
Есть ли возможность так же делать для корутин из нового модуля
asyncio? Собственно в функции будут исполняться несколько операций и хотелось бы при завершении каждого шага возвращать через
yield некие данные в использующую этот генератор функцию. Если в корутине написать просто
yield без
from, то возникает RuntimeError('Task got bad yield'). Можно конечно каждое действие объявить как корутину и запускать такие задачи списком:
tasks = [
asyncio.async(t1()),
asyncio.async(t2())
]
loop.run_until_complete(asyncio.wait(tasks))
Однако тогда непонятно, как достать результат выполнения каждой функции.