为什么使用create_task创建的期货会永远运行?

时间:2018-07-03 16:48:11

标签: python multithreading python-asyncio coroutine

因此,我摆弄了Python的asyncio,并使用loop.create_task(myfunct())创建了新的期货。 myfunct()完成后,将返回。由于我使用loop.run_until_complete(..)创建了循环,因此我期望create_task创建的线程在函数完成后将被销毁。但是,当我在Process Explorer中观看Python进程时,我发现线程从未被破坏。

进程启动时的线程数: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 :(得分:0)

你说

  

我希望create_task创建的线程在函数完成后会被破坏

但是create_task根本不创建线程。您看到的线程与create_task完全无关。这里没问题。

您看到的大多数线程都来自ThreadPoolExecutor,它们是run_in_executor的默认执行程序。