Ответ подсказали в другом месте. В общем, можно использовать для таких целей очередь:
import random
import asyncio
@asyncio.coroutine
def coro(que: asyncio.Queue):
res = 0
t = random.random() * 3
yield from que.put('start 1')
yield from asyncio.sleep(t)
yield from que.put('value 1 = {}'.format(t))
res += t
t = random.random() * 3
yield from que.put('start 2')
yield from asyncio.sleep(t)
yield from que.put('value 2 = {}'.format(t))
res += t
t = random.random() * 3
yield from que.put('start 3')
yield from asyncio.sleep(t)
yield from que.put('value 3 = {}'.format(t))
res += t
yield from que.put(None)
return res
@asyncio.coroutine
def run(que: asyncio.Queue):
while True:
res = yield from que.get()
if res is None:
break
print(res)
q = asyncio.Queue()
asyncio.async(run(q))
asyncio.async(coro(q))
asyncio.get_event_loop().run_forever()