Async Context Manager __aexit__ Выполнение Перед выполнением всех задач - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь подавить sys.stdout из печати на консоль с помощью диспетчера асинхронного контекста, если включен «режим слияния» True.

Код для возврата sys.stdout в исходное состояние иногда выполняется до того, как все задачи завершены.Иногда он также не выводится на консоль после сброса sys.stdout.

Я пробовал несколько разных подходов, и следующий код, похоже, помогает.Я посчитал оставшиеся задачи, которые нужно было выполнить, прежде чем я должен сбросить sys.stdout и проверить, сколько именно задач все еще выполняется.

Но я не думаю, что это хорошее решение проблемы, оно может вызвать слишком много проблем в будущем, добавляя больше функций в код.

class SilentMode():

    def __init__(self, silent_mode: bool):
        self.silent_mode = silent_mode
        self.orginal_stdout = sys.stdout

    async def __aenter__(self) -> None:

        if self.silent_mode:
            sys.stdout = open(os.devnull, 'w')

    async def __aexit__(self, exc_type, exc_val, exc_tb) -> None:

        if self.silent_mode:
            sys.stdout.flush()
            while len(asyncio.all_tasks()) > 3:
                await asyncio.sleep(.1)

            sys.stdout = self.orginal_stdout

Вот репозиторий GitHub с остальным кодом для справки.

...