Python3 asyncio "Task wurde zerstört, aber es ist ausstehend" mit einer bestimmten Bedingung

8

Hier ist ein vereinfachter Code, der python3-Coroutine verwendet und den Handler für SIGING- und SIGTERM-Signale zum ordnungsgemäßen Stoppen des Jobs setzt:

%Vor%

Wenn ich es über:

ausführe %Vor%

Es stoppt mit Strg-C ohne Warnungen. Aber wenn ich es über:

%Vor%

Es gibt eine Warnung mit Strg-C aus:

%Vor%

Die gleiche Warnung bekomme ich, wenn ich dieses Skript über:

installiere %Vor%

Meine Python-Version ist "3.4.2"

    
willir 03.11.2015, 17:06
quelle

2 Antworten

8

Ok. Ich denke, ich habe herausgefunden, wie ich alle Aufgaben stoppen soll.

  1. Zunächst einmal, soweit ich das verstehe. BaseEventLoop.stop () soll nur BaseEventLoop.run_forever () . Man sollte also alle Aufgaben über Future.cancel abbrechen. Um alle Aufgaben zu erhalten, können Sie Task.all_tasks statische Methode verwenden
  2. Nach dem Abbruch werden alle Tasks asyncio.CancelledError Ausnahme von run_until_complete ausgelöst. Man sollte es also erwischen, wenn man es nicht auf stderr ausdrucken will.
  3. Und in einigen Fällen bekomme ich diesen Fehler: TypeError: signal handler must be signal.SIG_IGN, signal.SIG_DFL, or a callable object . Ich habe einige Themen zu diesem Fehler gefunden:

    Sie alle sagen, dass es durch Schließen der Schleife behoben werden kann, bevor die Anwendung beendet wird.

So bekommen wir diesen Code:

%Vor%

Es funktioniert auch mit signal.signal . Aber wie Vincent bemerkte loop.add_signal_handler sieht in diesem Fall besser aus.

Aber ich bin mir immer noch nicht sicher, ob das der beste Weg ist, um alle Aufgaben zu stoppen.

    
willir 08.11.2015, 14:30
quelle
2

Verwenden Sie anstelle von asyncio.wait :

asyncio.gather
  

Annullierung: Wenn die äußere Zukunft annulliert wird, werden auch alle Kinder annulliert, die noch nicht abgeschlossen sind.

Beispiel:

%Vor%     
Vincent 07.11.2015 11:56
quelle