2017-09-10 5 views
1

私のプロデューサ/コンシューマコルーチンのエラーは、アイテムと未完了のタスクをasyncioキューに残すことがあります。エラーが発生した場合は、単にループを停止し、保留中のタスクをキャンセルしてキューをクリアします。私は最初の2つのことを終えることができますが、私はキューをクリアする簡単な方法を見つけることができません。 this answerを読んだ後、私は三つの方法を思い付く:python3でasyncioキューをクリアする適切な方法は?

import asyncio 

q=asyncio.Queue() 
for i in range(5): 
    q.put_nowait(i) 
q.get_nowait() 

loop=asyncio.get_event_loop() 

#this will raise an error if q cannot join 
loop.run_until_complete(asyncio.wait_for(q.join(),1)) 

#method 1 
q._queue.clear() 
q._finished.set() 
q._unfinished_tasks = 0 

#method 2 
for _ in range(q.qsize()): 
    q.get_nowait() 
for _ in range(q._unfinished_tasks): 
    q.task_done() 

#method 3 
del q 
q=asyncio.Queue() 

だから、どちらが良いですか?

+1

関連:[プロデューサasyncioユーザマニュアルの/消費者(https://asyncio.readthedocs.io/en/latest/producer_consumer.html) – Vincent

答えて

0

Iは、様々なDBussy example scriptsでこれを行った:

for task in asyncio.Task.all_tasks(loop) : 
    task.cancel() 
    try : 
     loop.run_until_complete(task) 
    except asyncio.CancelledError : 
     pass 
    #end try 
#end for