2014-11-07 4 views
6

Ich interessiere mich für continuations, speziell in Pythons C-API. Von dem, was ich verstehe, erfordert die Art der Fortsetzungen die Un-Abstrahierung von Aufrufkonventionen auf niedriger Ebene, um den Aufruf-Stack nach Bedarf zu manipulieren. Ich hatte das Glück, ein paar Beispiele dieser verstreuten here und there zu finden. In den wenigen Beispielen, die ich gefunden habe, erfolgt diese Un-Abstraktion entweder mit cleverem C (mit Annahmen über die Umgebung) oder mit benutzerdefinierter Assemblierung.Kann das Ein- und Ausschalten von PyFrameObjects eine gute Implementierung von Fortsetzungen sein?

Was jedoch an Python cool ist, ist, dass es seinen eigenen Interpreter-Stack hat, der aus PyFrameObject s besteht. Angenommen, single-threaded Anwendungen für jetzt, sollte es nicht genug sein, nur ein- und auszuschalten PyFrameObjects s, um Fortsetzungen in Pythons C-API zu implementieren? Warum beschäftigen sich diese Autoren überhaupt mit dem Low-Level-Zeug?

+0

Ich kann das nicht wirklich beantworten, aber die Optimierung kommt mir in den Sinn. Gute Frage! – ThinkChaos

+2

Das Tauschen von Rahmenobjekten ist im Grunde, wie Generatorfunktionen funktionieren. Wenn Sie auf "yield" klicken, wird das aktuelle Frame-Objekt im Generator gespeichert und vom Stapel ausgegeben. Wenn der nächste Wert benötigt wird, wird das Rahmenobjekt auf den Stapel zurückgeschoben und die Ausführung wird dort fortgesetzt, wo es aufgehört hat. –

Antwort

1

Generatoren arbeiten, indem sie den Stapel (tatsächlich verkettete Liste) von Rahmenobjekten manipulieren. Aber das wird nur für reinen Python-Code helfen. Es wird Ihnen nicht helfen, wenn Ihr Code C-Code ausgeführt wird. Wenn Sie sich beispielsweise in C-Code innerhalb einer E/A-Routine befinden, können Sie das Python-Rahmenobjekt nicht ändern, um die Ausführung an eine andere Stelle zu bringen. Sie müssen in der Lage sein, den C-Stapel zu ändern, um dies zu tun. Das tun Pakete wie Greenlets für dich.

+0

Ich denke, das ist die Antwort. Seltsamerweise denke ich, dass die Manipulation von 'PyFrameObject' * genügen würde, wenn Sie die in C implementierten Teile nicht benötigen, um an dem Fortsetzungsfest teilzunehmen. In der Tat wird dies mehr oder weniger durch die Generatoren und Coroutines bewiesen. – Julian

Verwandte Themen