Почему фьючерсы, созданные с помощью create_task, работают вечно? - PullRequest
0 голосов
/ 03 июля 2018

Итак, я возлюсь с asyncio в Python и создаю новые фьючерсы, используя loop.create_task(myfunct()). Когда myfunct() заканчивается, он возвращается. Поскольку я создал свой цикл с использованием loop.run_until_complete(..), я ожидал, что поток, созданный с помощью create_task, будет уничтожен после завершения функции. Но когда я наблюдаю за процессом Python в Process Explorer , я вижу, что потоки никогда не уничтожаются.

Тем при запуске процесса: 7 enter image description here

Тем после некоторой работы (и завершения): 25 enter image description here

Что здесь не так?

import sys
import asyncio


async def async_process_line(line):
    print("STARTED WORKING LINE\t'" + line + "'")
    await asyncio.sleep(3)
    return line


# Optional callback function
def write_stdout(future):
    print("FINISHED WORKING LINE\t'" + future.result() + "'")


async def async_read_stdin(loop):
    while True:
        line = await loop.run_in_executor(None, sys.stdin.readline)
        line = str(line).strip()
        # Exit loop when "exit" is typed in stdin
        if(line == "exit"):
            break
        elif(line != ""):
            task = loop.create_task(async_process_line(line))
            # optional callback binding
            task.add_done_callback(write_stdout)

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    try:
        loop.run_until_complete(async_read_stdin(loop))
    except KeyboardInterrupt:
        pass
    finally:
        loop.close()

1 Ответ

0 голосов
/ 04 июля 2018

Вы говорите

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

, но create_task вообще не создает потоков. Потоки, которые вы видите, не имеют абсолютно никакого отношения к create_task. Здесь все в порядке.

Большинство потоков, которые вы видите, происходят из ThreadPoolExecutor, используемого в качестве исполнителя по умолчанию для run_in_executor.

...