Python Idle und KeyboardInterrupts

8

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.

    
cssndrx 06.07.2011, 15:28
quelle

2 Antworten

6

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.

    
Jeremy Brown 06.07.2011, 18:03
quelle
1

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!

    
Sam 06.07.2011 16:20
quelle

Tags und Links