asyncio.Task 不会被垃圾收集

问题描述 投票:0回答:1

为什么下面使用 asyncio.create_task() 创建的任务没有被垃圾回收?

import asyncio
import gc

c = 0


async def run():
    global c
    try:
        while True:
            await asyncio.sleep(1)
            c += 1
    except Exception as e:
        print(e)


async def main():
    task = asyncio.create_task(run())
    del task
    while True:
        await asyncio.sleep(0.2)
        print(c)
        gc.collect()


asyncio.run(main())

预期:

0
0
0
asyncio.CancelledError

实际:

0
0
0
0
0
1
1
1
1
1
..
101
101
101
101
101
102
...
python python-asyncio
1个回答
0
投票
task = asyncio.create_task(run())
del task

task
并不是该任务的唯一参考。
asyncio.create_task
仍然有一个或多个对该任务的引用,因此它不会被垃圾收集。

© www.soinside.com 2019 - 2024. All rights reserved.