2017-09-10 5 views
1

Fehler in meinen Producer/Consumer-Korutinen können Elemente und nicht abgeschlossene Aufgaben in der asyncio-Warteschlange belassen. Wenn ein Fehler auftritt, möchte ich die Schleife einfach anhalten, die ausstehenden Aufgaben abbrechen und die Warteschlange löschen. Während ich die ersten beiden Dinge erledigen kann, finde ich keinen einfachen Weg, die Warteschlange zu löschen. Nach der Lektüre this answer, komme ich mit drei Methoden auf:Korrekte Möglichkeit, eine Asyncio-Warteschlange in Python3 zu löschen?

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

So was ist besser?

+1

Verwandte: [Erzeuger/Verbraucher in asyncio Benutzerdokumentation] (https://asyncio.readthedocs.io/en/latest/producer_consumer.html) – Vincent

Antwort

0

Ich tat dies in verschiedenen 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 
Verwandte Themen