Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Внутри CPython гид по интерпретатору Python.pdf
Скачиваний:
6
Добавлен:
07.04.2024
Размер:
8.59 Mб
Скачать

Выводы    161

В файле Lib traceback.py можно использовать функцию walk_stack() для получения трассировки:

def walk_stack(f):

"""Обход стека с получением кадра и номера строки для каждого кадра.

Переход осуществляется по ссылке f.f_back из заданного кадра. Если кадр не задан, используется текущий стек.

Обычно используется c StackSummary.extract

"""

if f is None:

f = sys._getframe().f_back.f_back while f is not None:

yield f, f.f_lineno f = f.f_back

В качестве кадра выбирается родитель родителя (sys._getframe().f_back.f_ back), потому что в трассировке не должны присутствовать вызовы walk_ stack() или print_trace(). Указатель f_back отслеживается до вершины стека вызовов.

sys._getframe() — функция Python API для получения атрибута frame текущего потока.

А вот как будет выглядеть стек с тремя кадрами, каждый из которых связан со своим объектом кода и состоянием потока, ссылающимся на текущий кадр:

 

 

 

FRAME 0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

f_back

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

FRAME 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

f_back

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

FRAME 2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

frame

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ВЫВОДЫ

В этой главе вы познакомились с «мозгом» CPython. Основной цикл вычисления обеспечивает взаимодействие между скомпилированным кодом

Книги для программистов: https://t.me/booksforits

162    Цикл вычисления

Python и базовыми модулями расширения C, библиотеками и системными вызовами.

Некоторые темы этой главы были изложены предельно кратко, так как мы вернемся к ним далее в книге. Например, у интерпретатора CPython есть основной цикл вычисления, но при этом могут работать сразу несколько циклов — параллельно или конкурентно.

В CPython может работать множество циклов вычисления, выполняющих несколько кадров в системе. В одной из следующих глав «Параллелизм и конкурентность» вы увидите, как система стека кадров используется CPython для выполнения на разных ядрах процессора. Кроме того, API объекта кадра CPython позволяет приостанавливать и возобновлять выполнение кадров в форме асинхронного программирования.

Загрузка переменных с использованием стека значений требует выделения памяти и управления ею. Чтобы CPython мог работать эффективно, он должен иметь надежный механизм управления памятью. В следующей главе рассматривается процесс управления памятью и его связь с указателями PyObject, используемыми циклом вычисления.

Книги для программистов: https://t.me/booksforits