计算事件循环中的活动任务

El *_*uso 7 python-3.x python-asyncio

如何找出事件循环中有多少活动任务?在文档中我只找到asyncio.Task.all_tasks()但它是简单的增量计数器:

import asyncio


async def coro():
    await asyncio.sleep(1)


async def main():
    tasks = []
    print('Tasks count: ', len(asyncio.Task.all_tasks()))
    for idx in range(3):
        task = asyncio.ensure_future(coro())
        tasks.append(task)
        print('Tasks count: ', len(asyncio.Task.all_tasks()))
    await asyncio.gather(*tasks)
    print('Tasks count: ', len(asyncio.Task.all_tasks()))


loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Run Code Online (Sandbox Code Playgroud)

输出:

Tasks count:  1
Tasks count:  2
Tasks count:  3
Tasks count:  4
Tasks count:  4
Run Code Online (Sandbox Code Playgroud)

预期产量:

Tasks count:  1
Tasks count:  2
Tasks count:  3
Tasks count:  4
Tasks count:  1
Run Code Online (Sandbox Code Playgroud)

Yer*_*iaz 8

all_tasks返回所有已注册的任务,包括已完成的任务.您可以简单地过滤任务done()以获取活动的任务:

import asyncio


async def coro():
    await asyncio.sleep(1)


async def main():
    tasks = []
    print('Tasks count: ', len(asyncio.Task.all_tasks()))
    for idx in range(3):
        task = asyncio.ensure_future(coro())
        tasks.append(task)
        print('Tasks count: ', len(asyncio.Task.all_tasks()))
    await asyncio.gather(*tasks)
    print('Tasks count: ', len(asyncio.Task.all_tasks()))
    print('Active tasks count: ', len(
        [task for task in asyncio.Task.all_tasks() if not task.done()])
    )

loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Run Code Online (Sandbox Code Playgroud)

哪个输出:

Tasks count:  1
Tasks count:  2
Tasks count:  3
Tasks count:  4
Tasks count:  4
Active tasks count:  1
Run Code Online (Sandbox Code Playgroud)

  • `print('Activetaskscount:', sum(1 for task in asyncio.all_tasks() if task.done()))` 不会创建一个临时列表只是为了调用 `len()` (2认同)

Pau*_*tts 7

在 Python 3.7+ 中,有一个asyncio.all_tasks()方法可以返回当前运行循环的未完成任务。

所以这简化为:

count_active_tasks = len(asyncio.all_tasks())