清除中断事件循环而不关闭循环(Clear an interrupted event loop wit

2019-09-27 14:09发布

试试下面的代码:

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) 。 你会看到,所有取消/完成的任务仍结合的循环。 而不是关闭并得到一个新的循环,我怎么能保证环路,只清除完成/取消的任务?

Answer 1:

任务被绑定到循环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运行后空集。



文章来源: Clear an interrupted event loop without closing the loop