asyncio.Task 在使用 del

问题描述 投票: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 garbage-collection python-asyncio
1个回答
0
投票
task = asyncio.create_task(run())
del task

局部变量

task
并不是对该任务的唯一引用。
asyncio.create_task
已创建对任务的一个或多个引用,这些引用仍由
asyncio
使用,因此不会被垃圾收集。

您可以使用

gc.get_referrers
:

查看哪些对象保存对任务的引用
task = asyncio.create_task(run())
print(gc.get_referrers(task))
del task

输出:

[<TaskStepMethWrapper object at 0x7f04ff32ece0>]

这是这些之一。

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