Как генераторы и сопрограммы реализованы в CPython?

Я читал, что в CPython стек интерпретатора (список функций Python, вызываемых для достижения этой точки) смешивается со стеком C (список функций C, которые были вызваны в собственном коде интерпретатора). Если так, то как реализованы генераторы и сопрограммы? Как они помнят свое состояние выполнения? Копирует ли CPython стек каждого генератора / сопрограммы в стек ОС и из него? Или CPython просто хранит самый верхний кадр стека генератора в куче, поскольку генератор может работать только из этого самого верхнего кадра?

3 ответа

Решение

yield инструкция принимает текущий исполняемый контекст как замыкание и преобразует его в собственный живой объект. Этот объект имеет __iter__ метод, который будет продолжаться после этого оператора yield.

Таким образом, стек вызовов преобразуется в объект кучи.

Представление о том, что стек Python и стек C в запущенной программе Python смешаны, может ввести в заблуждение.

Стек Python - это нечто полностью отделенное от реального стека C, используемого интерпретатором. Структуры данных в стеке Python на самом деле являются полными объектами "фрейма" Python (которые могут даже подвергаться анализу и иметь некоторые атрибуты, измененные во время выполнения). Этот стек управляется виртуальной машиной Python, которая сама работает на C и, таким образом, имеет обычную C-программу, машинный уровень, стек.

При использовании генераторов и итераторов интерпретатор просто сохраняет соответствующий объект фрейма где-то еще, чем в стеке программ Python, и выталкивает его туда, когда возобновляется выполнение генератора. Это "где-то еще" является самим объектом генератора. Вызов метода "next" или "send" для объекта генератора вызывает это.

В нескольких существующих ответах и ​​комментариях утверждается, что Python поддерживает "программный стек", который полностью отделен от стека C виртуальной машины. Это утверждение неверно.

Проверьте ссылку: http://en.wikipedia.org/wiki/Stackless_Python

Stackless Python существует, но не является мейнстримом. Понимание - вопрос правильный.

Другие вопросы по тегам