2017-10-25 18 views
1

は、次のコードを試してみてくださいループを閉じずに、中断イベントループ:クリア

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)してタスクを検査します。取り消された/完了したタスクはすべてループにバインドされていることがわかります。新しいループを閉じて取得する代わりに、どのようにループを維持し、終了/キャンセルされたタスクのみをクリアすることができますか?

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の実行後に空のセットが表示されます:

答えて

1

タスクがweakrefでループにバインドされている、それはそれらへの参照が存在しない場合、彼らは次のGCの実行にガベージコレクトされることを意味します。