在不关闭循环的情况下清除中断的事件循环

时间:2017-10-25 03:22:35

标签: python-3.x python-asyncio

请尝试以下代码:

import asyncio

async def fun1():
    #block
    await asyncio.sleep(10)

loop = asyncio.get_event_loop()
count = 0
while count < 10:
    count += 1
    print(count)
    try:
        fut = asyncio.ensure_future(asyncio.wait_for(fun1(),1))
        loop.run_until_complete(fut)
    except:
        pass

然后按asyncio.Task.all_tasks(loop=loop)检查任务。您将看到所有已取消/已完成的任务仍然绑定到循环。而不是关闭并获得一个新的循环,我如何保持循环并只清除已完成/取消的任务?

1 个答案:

答案 0 :(得分:2)

任务绑定到weakref循环,这意味着如果不存在对它们的引用,它们将在下一个gc运行时被垃圾收集:

import asyncio
import gc


def main():
    #  your code here
main()


print('Before gc:', asyncio.Task.all_tasks())

gc.collect()

print('After gc:', asyncio.Task.all_tasks())

在gc run之后你会看到空集。