Мне интересно, как дождаться, пока все сопрограммы завершатся sh в рекурсивном вызове. Если это многопоточность, у меня обычно есть очередь задач и пул потоков фиксированного размера, каждый поток пытается извлечь задачу из очереди после завершения sh предыдущей задачи. И я могу легко присоединиться к пулу потоков.
Но в сопрограмме я не уверен, как правильно это сделать. Вот небольшой пример, который я придумаю
import asyncio
async def main():
tasks = []
res = []
tasks.append(recur(0, res, tasks))
for t in tasks:
await t
return res
async def recur(depth, res, tasks):
res.append(1)
if depth > 10:
return
for _ in range(2):
tasks.append(recur(depth + 1, res, tasks))
res = asyncio.get_event_loop().run_until_complete(main())
print(len(res)) # expect 4095
У меня есть две проблемы:
- не уверен, что для нескольких сопрограмм безопасно получить доступ к
tasks
, нужна ли нам мьютекс? tasks
растет, поэтому в главном l oop мы пытаемся дождаться каждой задачи, но мы никогда не можем быть уверены, что в tasks
Я тестирую много раз, результат всегда 4095, но я считаю, что это решение как-то не так. Может ли кто-нибудь предоставить правильную реализацию?