KeyboardInterrupts in Idle arbeiten für mich 90% der Zeit, aber ich habe mich gefragt, warum sie nicht immer funktionieren. Im Leerlauf, wenn ich das tue
%Vor%und versuchen Sie dann ein KeyboardInterrupt mit Strg + C, es unterbricht den Prozess nicht bis nach dem Schlafen für 10 Sekunden.
Der gleiche Code und ein KeyboardInterrupt über Strg + C funktionieren sofort in der Shell.
Ein kurzer Blick auf die IDLE-Quelle zeigt, dass KeyboardInterrupts einige spezielle Fälle behandeln: Ссылка
Darüber hinaus wird Code tatsächlich in einem separaten Prozess ausgeführt, mit dem der Haupt-IDLE-GUI-Prozess über RPC kommuniziert. Sie werden unter diesem Modell ein anderes Verhalten erhalten - es ist am besten, nur mit dem kanonischen Interpreter zu testen (über die Kommandozeile, interaktiv usw.).
============
Graben tiefer ...
Der Socket auf dem RPC-Server wird in einem sekundären Thread verwaltet, der einen KeyboardInterrupt mit einem Aufruf von thread.interrupt_main () propagieren soll ( Ссылка ). Das Verhalten ist nicht wie erwartet ... Dieser Beitrag weist darauf hin, dass interrupt_main aus irgendeinem Grund nicht die Granularität bietet, die Sie erwarten würden: Ссылка
Async API-Funktionen in cPython sind ein wenig albern (aus meiner Erfahrung) aufgrund der Art und Weise, wie die Interpreter-Schleife behandelt wird, so dass es mich nicht überrascht. interrupt_main () ruft PyErr_SetInterrupt () auf, um den Interpreter für die Verarbeitung eines SIGINT im Haupt-Thread asynchron zu benachrichtigen. Von Ссылка :
Diese Funktion simuliert den Effekt von Ein SIGINT-Signal kommt an - das nächste Zeit PyErr_CheckSignals () wird aufgerufen, KeyboardInterrupt wird ausgelöst
Dies würde erfordern, dass der Interpreter eine beliebige Anzahl von Bytecode-Anweisungen durchläuft, bevor PyErr_CheckSignals () erneut aufgerufen wird - etwas, was wahrscheinlich nicht während einer time.sleep () passiert. Ich wage zu sagen, dass es eine Warze ist, ein SIGINT zu simulieren, anstatt ein SIGINT zu signalisieren.
Siehe Artikel :
Ich zitiere:
Wenn Sie versuchen, ein CPython-Programm zu stoppen mit Control-C, dem Interpreter löst eine KeyboardInterrupt-Ausnahme aus.
Es macht Sinn, weil der Thread 10 Sekunden lang schläft und so keine Ausnahmen ausgelöst werden können, bis die 10 Sekunden verstrichen sind. Ctrl + c arbeitet jedoch immer in der Shell, weil Sie versuchen, einen Prozess zu stoppen und keine Python-Ausnahme KeyboardInterrupt auszulösen.
Siehe auch die zuvor beantwortete Frage .
Ich hoffe, das hilft!
Tags und Links python python-idle