为什么下面使用
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
...
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>]
这是这些之一。