2016-12-07 7 views
1

イベントループ内のアクティブなタスクの数はどのようにして調べることができますか?ドキュメントで 私だけ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 

答えて

4

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())) 
    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 
あなたは、単にアクティブなものを得るために done()によってタスクをフィルタリングすることができます
関連する問題