asyncio.Task.all_tasks()的不同行为

时间:2017-09-18 16:43:12

标签: python-asyncio

第一个例子:

import asyncio

async def req():
    print('request')
    await asyncio.sleep(1)

async def run():
    print(len(asyncio.Task.all_tasks()))
    asyncio.ensure_future(req())
    print(len(asyncio.Task.all_tasks()))
    await asyncio.sleep(2)
    print(len(asyncio.Task.all_tasks()))

loop = asyncio.get_event_loop()
loop.run_until_complete(run())

结果是:

1
2
request
1

第二个例子:

import asyncio

async def req():
    print('request')
    await asyncio.sleep(1)

async def run():
    print(len(asyncio.Task.all_tasks()))
    t = asyncio.ensure_future(req())
    print(len(asyncio.Task.all_tasks()))
    await t
    print(len(asyncio.Task.all_tasks()))

loop = asyncio.get_event_loop()
loop.run_until_complete(run())

结果是:

1
2
request
2

那么,为什么在第一个例子中最后一次调用 asyncio.Task.all_tasks()返回1而在第二个例子中它返回2? 换句话说,为什么在第一个例子中,包装req()从一组事件循环的所有任务中删除,以及为什么第二个例子不正确。

1 个答案:

答案 0 :(得分:2)

destroyed all_tasks()时,该任务已从del移除。

添加 [...] await t del t print(len(asyncio.Task.all_tasks())) 声明:

1
2
request
1

它会产生:

{{1}}