Es ist nur sicher, wenn Ihre Variablen bei alle Punkt in Ihrer Schleife in einem Zustand sind, in dem Sie sie speichern und später fortsetzen können.
Um sicher zu sein, könnten Sie stattdessen die KeyboardInterrupt
fangen, bevor es passiert und setzen Sie eine Flagge, für die Sie testen können. Um dies zu erreichen, müssen Sie das Signal abfangen, das die KeyboardInterrupt
verursacht, die SIGINT
ist. In Ihrem Signal-Handler können Sie dann ein Flag setzen, nach dem Sie in Ihrer Berechnungsfunktion suchen. Beispiel:
import signal
import time
interrupted = False
def on_interrupt(signum, stack):
global interrupted
interrupted = True
def long_running_function():
signal.signal(signal.SIGINT, on_interrupt)
while not interrupted:
time.sleep(1) # do your work here
signal.signal(signal.SIGINT, signal.SIG_DFL)
long_running_function()
Der entscheidende Vorteil ist, dass Sie über den Punkt verfügen, an dem die Funktion unterbrochen wird. Sie können an jedem beliebigen Ort Schecks für if interrupted
hinzufügen. Dies hilft dabei, in einem konsistenten, wiederaufsetzbaren Zustand zu sein, wenn die Funktion unterbrochen wird.
(Mit python3 dieser nonlocal
schöner Verwendung gelöst werden kann, dies als Übung für den Leser überlassen wird als die Asker haben nicht angegeben, an dem Python-Version sie sind.)
(Diese auf Windows nach funktionieren sollen zur Dokumentation, aber ich habe es nicht getestet.Bitte melden Sie es zurück, wenn es nicht so, dass zukünftige Leser gewarnt werden.)
Die Vorgehensweise, die Sie in Ihrem dritten Absatz beschreiben, sollte gut funktionieren. Lassen Sie uns wissen, wenn Sie spezielle Probleme bei der Implementierung haben. – Kevin
KeyboardInterrupt ist in Ordnung, ich habe einige Open-Source-Projekte gesehen, die es tun. Was vielleicht nicht in Ordnung ist, bricht vorzeitig aus der Schleife. – mehmetminanc
Sie können auch 'dill' anstelle von' pickle' verwenden (letzterer kann mit lambdas und statischen Methoden nicht umgehen). Eine weitere gute Methode besteht darin, Ihre Ergebnisse in einer Datei für jede Iteration in einer Schleife zeilenweise zu speichern. – kurtosis