python3 рекурсивные сопрограммы ждут все, чтобы закончить - PullRequest
0 голосов
/ 28 февраля 2020

Мне интересно, как дождаться, пока все сопрограммы завершатся 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

У меня есть две проблемы:

  1. не уверен, что для нескольких сопрограмм безопасно получить доступ к tasks, нужна ли нам мьютекс?
  2. tasks растет, поэтому в главном l oop мы пытаемся дождаться каждой задачи, но мы никогда не можем быть уверены, что в tasks

Я тестирую много раз, результат всегда 4095, но я считаю, что это решение как-то не так. Может ли кто-нибудь предоставить правильную реализацию?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...