2017-10-25 1 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)하여 작업을 검사합니다. 취소되거나 완료된 모든 작업이 여전히 루프에 바인딩되어 있음을 알 수 있습니다. 새로운 루프를 닫고 가져 오는 대신 루프를 유지하고 완료/취소 된 태스크 만 지우는 방법은 무엇입니까?

답변

1

작업이 weakref와 루프에 바인딩 된, 그것은 그들에게 참조가 존재하지 않는 경우가 다음 GC의 실행에 수집 된 쓰레기된다는 뜻 : 당신은 GC를 실행 한 후 빈 세트를 볼 수 있습니다

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

.