【问题标题】:Count active tasks in event loop计算事件循环中的活动任务
【发布时间】:2016-12-07 23:50:43
【问题描述】:

如何找出事件循环中有多少活动任务? 在文档中我只找到 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())

输出:

Tasks count:  1
Tasks count:  2
Tasks count:  3
Tasks count:  4
Tasks count:  4

预期输出:

Tasks count:  1
Tasks count:  2
Tasks count:  3
Tasks count:  4
Tasks count:  1

【问题讨论】:

    标签: python-3.x python-asyncio


    【解决方案1】:

    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())
    

    哪些输出:

    Tasks count:  1
    Tasks count:  2
    Tasks count:  3
    Tasks count:  4
    Tasks count:  4
    Active tasks count:  1
    

    【讨论】:

    • print('Active tasks count:', sum(1 for task in asyncio.all_tasks() if task.done())) 不会创建一个临时列表来调用len()
    【解决方案2】:

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

    所以这简化为:

    count_active_tasks = len(asyncio.all_tasks())

    【讨论】:

      猜你喜欢
      • 2017-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      相关资源
      最近更新 更多