Инициализация, Заключительные действия и Потоки
Подробности о конфигурации интерпретатора перед инициализацией см. в разделе Конфигурация инициализации Python.
Перед инициализацией Python
В приложении, встраивающем Python, функция Py_Initialize() должна быть вызвана перед использованием других функций API Python/C; за исключением нескольких функций и глобальных переменных конфигурации.
Следующие функции могут быть безопасно вызваны до инициализации Python:
-
Функции, которые инициализируют интерпретатор:
Py_Initialize()Py_InitializeEx()Py_InitializeFromConfig()Py_BytesMain()Py_Main()- функции предварительной инициализации среды выполнения, описанные в Конфигурации инициализации Python
-
Функции конфигурации:
PyImport_AppendInittab()PyImport_ExtendInittab()PyInitFrozenExtensions()PyMem_SetAllocator()PyMem_SetupDebugHooks()PyObject_SetArenaAllocator()Py_SetProgramName()Py_SetPythonHome()PySys_ResetWarnOptions()- функции конфигурации, описанные в Конфигурации инициализации Python
-
Информационные функции:
-
Утилиты:
Py_DecodeLocale()- функции отчётности о состоянии и утилиты, описанные в Конфигурации инициализации Python
-
Аллекаторы памяти:
-
Синхронизация:
Примечание
Несмотря на внешнее сходство с некоторыми функциями, перечисленными выше, следующие функции не следует вызывать до инициализации интерпретатора: Py_EncodeLocale(), Py_GetPath(), Py_GetPrefix(), Py_GetExecPrefix(), Py_GetProgramFullPath(), Py_GetPythonHome(), Py_GetProgramName(), PyEval_InitThreads() и Py_RunMain().
Глобальные переменные конфигурации
В Python есть переменные для глобальной конфигурации, которые позволяют управлять различными функциями и опциями. По умолчанию эти флаги контролируются опциями командной строки.
Когда флаг устанавливается опцией, значение флага равно количеству раз, когда эта опция была установлена. Например, -b устанавливает Py_BytesWarningFlag в 1, а -bb устанавливает Py_BytesWarningFlag в 2.
-
int Py_BytesWarningFlag -
Этот API сохранён для обратной совместимости: вместо этого следует использовать установку
PyConfig.bytes_warning, см. Конфигурация инициализации Python.Выводит предупреждение при сравнении
bytesилиbytearrayсstrилиbytesсint. Выдает ошибку, если значение больше или равно2.Устанавливается опцией
-b.Устарело начиная с версии 3.12, будет удалено в версии 3.14.
-
int Py_DebugFlag -
Этот API сохранён для обратной совместимости: вместо этого следует использовать установку
PyConfig.parser_debug, см. Конфигурация инициализации Python.Включает вывод отладки парсера (только для специалистов, зависит от опций компиляции).
Устанавливается опцией
-dи переменной окруженияPYTHONDEBUG.Устарело начиная с версии 3.12, будет удалено в версии 3.14.
-
int Py_DontWriteBytecodeFlag -
Этот API сохранён для обратной совместимости: вместо этого следует использовать установку
PyConfig.write_bytecode, см. Конфигурация инициализации Python.Если установлено ненулевое значение, Python не будет пытаться записать файлы
.pycпри импорте исходных модулей.Устанавливается опцией
-Bи переменной окруженияPYTHONDONTWRITEBYTECODE.Устарело начиная с версии 3.12, будет удалено в версии 3.14.
-
int Py_FrozenFlag -
Этот API сохранён для обратной совместимости: вместо этого следует использовать установку
PyConfig.pathconfig_warnings, см. Конфигурация инициализации Python.Отключает сообщения об ошибках при вычислении пути поиска модулей в
Py_GetPath().Приватный флаг, используемый программами
_freeze_moduleиfrozenmain.Устарело начиная с версии 3.12, будет удалено в версии 3.14.
-
int Py_HashRandomizationFlag -
Этот API сохранён для обратной совместимости: вместо этого следует использовать установку
PyConfig.hash_seedиPyConfig.use_hash_seed, см. Конфигурация инициализации Python.Устанавливается в
1если переменная окруженияPYTHONHASHSEEDимеет ненулевое значение.Если флаг ненулевой, читает переменную окружения
PYTHONHASHSEEDдля инициализации секредного значения.Устарело начиная с версии 3.12, будет удалено в версии 3.14.
-
int Py_IgnoreEnvironmentFlag -
Этот API сохранён для обратной совместимости: вместо этого следует использовать установку
PyConfig.use_environment, см. Конфигурация инициализации Python.Игнорирует все переменные окружения
PYTHON*, например,PYTHONPATHиPYTHONHOME, которые могут быть заданы.Устанавливается опциями
-Eи-I.Устарело начиная с версии 3.12, будет удалено в версии 3.14.
-
int Py_InspectFlag -
Этот API сохранён для обратной совместимости: вместо этого следует использовать установку
PyConfig.inspect, см. Конфигурация инициализации Python.Когда скрипт передаётся в качестве первого аргумента или используется опция
-c, переходит в интерактивный режим после выполнения скрипта или команды, даже когдаsys.stdinне является терминалом.Устанавливается опцией
-iи переменной окруженияPYTHONINSPECT.Устарело начиная с версии 3.12, будет удалено в версии 3.14.
-
int Py_InteractiveFlag -
Этот API сохранён для обратной совместимости: вместо этого следует использовать установку
PyConfig.interactive, см. Конфигурация инициализации Python.Устанавливается опцией
-i.Устарело начиная с версии 3.12.
-
int Py_IsolatedFlag -
Этот API сохранён для обратной совместимости: вместо этого следует использовать установку
PyConfig.isolated, см. Конфигурация инициализации Python.Запуск Python в изолированном режиме. В изолированном режиме
sys.pathне содержит ни директорию скрипта, ни директорию site-packages пользователя.Устанавливается опцией
-I.Добавлена в версии 3.4.
Устарело начиная с версии 3.12, будет удалено в версии 3.14.
-
int Py_LegacyWindowsFSEncodingFlag -
Этот API сохранен для обратной совместимости: вместо него следует использовать
PyPreConfig.legacy_windows_fs_encoding, см. Конфигурация инициализации Python.Если флаг отличен от нуля, используйте кодировку
mbcsс обработчиком ошибокreplace, вместо кодировки UTF-8 с обработчиком ошибокsurrogatepass, для кодировки и обработчика ошибок файловой системы.Устанавливается в значение
1, если переменная средыPYTHONLEGACYWINDOWSFSENCODINGимеет значение, отличное от пустой строки.См. PEP 529 для получения более подробной информации.
Доступность: Windows.
Устарело начиная с версии 3.12, будет удалено в версии 3.14.
-
int Py_LegacyWindowsStdioFlag -
Этот API сохранен для обратной совместимости: вместо него следует использовать
PyConfig.legacy_windows_stdio, см. Конфигурация инициализации Python.Если флаг отличен от нуля, используйте
io.FileIOвместоio._WindowsConsoleIOдля стандартных потоковsys.Устанавливается в
1, если переменная средыPYTHONLEGACYWINDOWSSTDIOимеет значение, отличное от пустой строки.См. PEP 528 для получения более подробной информации.
Доступность: Windows.
Устарело начиная с версии 3.12, будет удалено в версии 3.14.
-
int Py_NoSiteFlag -
Этот API сохранен для обратной совместимости: вместо него следует использовать
PyConfig.site_import, см. Конфигурация инициализации Python.Отключить импорт модуля
siteи зависящие от сайта манипуляции сsys.path, которые он предполагает. Также отключить эти манипуляции, еслиsiteбыл явно импортирован позже (вызовитеsite.main(), если вы хотите, чтобы они были активированы).Устанавливается с помощью опции
-S.Устарело начиная с версии 3.12, будет удалено в версии 3.14.
-
int Py_NoUserSiteDirectory -
Этот API сохранен для обратной совместимости: вместо него следует использовать
PyConfig.user_site_directory, см. Конфигурация инициализации Python.Не добавляйте
user site-packages directoryвsys.path.Устанавливается с помощью опций
-sи-I, а также переменной средыPYTHONNOUSERSITE.Устарело начиная с версии 3.12, будет удалено в версии 3.14.
-
int Py_OptimizeFlag -
Этот API сохранен для обратной совместимости: вместо него следует использовать
PyConfig.optimization_level, см. Конфигурация инициализации Python.Устанавливается с помощью опции
-Oи переменной средыPYTHONOPTIMIZE.Устарело начиная с версии 3.12, будет удалено в версии 3.14.
-
int Py_QuietFlag -
Этот API сохранен для обратной совместимости: вместо него следует использовать
PyConfig.quiet, см. Конфигурация инициализации Python.Не отображать сообщения об авторских правах и версии, даже в интерактивном режиме.
Устанавливается с помощью опции
-q.Добавлена в версии 3.2.
Устарело начиная с версии 3.12, будет удалено в версии 3.14.
-
int Py_UnbufferedStdioFlag -
Этот API сохранен для обратной совместимости: вместо него следует использовать
PyConfig.buffered_stdio, см. Конфигурация инициализации Python.Принудительно установить стандартные потоки stdout и stderr в небуферизованный режим.
Устанавливается с помощью опции
-uи переменной средыPYTHONUNBUFFERED.Устарело начиная с версии 3.12, будет удалено в версии 3.14.
-
int Py_VerboseFlag -
Этот API сохранен для обратной совместимости: вместо него следует использовать
PyConfig.verbose, см. Конфигурация инициализации Python.Выводить сообщение каждый раз при инициализации модуля, показывая место (имя файла или встроенный модуль), из которого он загружается. Если значение больше или равно
2, выводить сообщение для каждого файла, который проверяется при поиске модуля. Также предоставляет информацию о очистке модулей при выходе.Устанавливается с помощью опции
-vи переменной средыPYTHONVERBOSE.Устарело начиная с версии 3.12, будет удалено в версии 3.14.
Инициализация и завершение интерпретатора
-
void Py_Initialize() -
Часть Стабильной ABI.
Инициализирует интерпретатор Python. В приложениях, которые встраивают Python, это должно быть выполнено перед использованием других функций API Python/C; см. Перед инициализацией Python для редких исключений.
Инициализирует таблицу загруженных модулей (
sys.modules), и создаёт базовые модулиbuiltins,__main__иsys. Также инициализирует путь поиска модулей (sys.path). Не устанавливаетsys.argv; используйте API Конфигурации инициализации Python для этого. Это бесполезно, если вызывается второй раз (без вызоваPy_FinalizeEx()сначала). Значение не возвращается; ошибка, если инициализация завершилась неудачно.Используйте
Py_InitializeFromConfig()для настройки Конфигурации инициализации Python.Примечание
В Windows, изменяет режим консоли с
O_TEXTнаO_BINARY, что также повлияет на использование консоли вне Python с помощью C Runtime.
-
void Py_InitializeEx(int initsigs) -
Часть Стабильной ABI.
Эта функция работает как
Py_Initialize(), если initsigs равно1. Если initsigs равно0, пропустит регистрацию обработки сигналов, что может быть полезно, когда CPython встроен в более крупное приложение.Используйте
Py_InitializeFromConfig()для настройки Конфигурации инициализации Python.
-
PyStatus Py_InitializeFromConfig(const PyConfig *config) -
Инициализирует Python с конфигурацией config, как описано в Инициализация с PyConfig.
См. раздел Конфигурации инициализации Python для деталей предварительной инициализации интерпретатора, заполнения структуры конфигурации выполнения и запроса возвращаемой структуры состояния.
-
int Py_IsInitialized() -
Часть Стабильной ABI.
Возвращает true (ненулевое значение), если интерпретатор Python инициализирован, false (нулевое значение), если нет. После вызова
Py_FinalizeEx(), возвращает false до тех пор, покаPy_Initialize()не будет вызван снова.
-
int Py_IsFinalizing() -
Часть Стабильной ABI с версии 3.13.
Возвращает true (ненулевое значение), если основной интерпретатор Python завершает работу. Возвращает false (нулевое значение) в противном случае.
Добавлена в версии 3.13.
-
int Py_FinalizeEx() -
Часть Стабильной ABI с версии 3.6.
Отменяет все инициализации, произведённые
Py_Initialize()и последующим использованием функций Python/C API, и уничтожает все дочерние интерпретаторы (см.Py_NewInterpreter()ниже), которые были созданы и ещё не уничтожены с момента последнего вызоваPy_Initialize(). В идеале, освобождает всю память, выделенную интерпретатором Python. Это бесполезно, если вызывается второй раз (без вызоваPy_Initialize()снова).Поскольку это обратное действие
Py_Initialize(), его следует вызывать в том же потоке с тем же активным интерпретатором. Это значит, основной поток и основной интерпретатор. Никогда не следует вызывать его, пока выполняетсяPy_RunMain().Обычно возвращается
0. Если во время завершения произошли ошибки (очистка буферизованных данных), возвращается-1.Эта функция предоставляется по ряду причин. Приложение, которое встраивает интерпретатор Python, может захотеть перезапустить Python без перезапуска самого приложения. Приложение, которое загрузило интерпретатор Python из динамически загружаемой библиотеки (или DLL), может захотеть освободить всю память, выделенную Python, перед разгрузкой DLL. Во время поиска утечек памяти в приложении разработчик может захотеть освободить всю память, выделенную Python, перед выходом из приложения.
Ошибки и предостережения: Уничтожение модулей и объектов в модулях происходит в случайном порядке; это может привести к ошибкам деструкторов (
__del__()методы) при зависимости от других объектов (даже функций) или модулей. Динамически загруженные расширенные модули, загруженные Python, не разгружаются. Небольшое количество памяти, выделенной интерпретатором Python, может не быть освобождено (если вы найдёте утечку, сообщите об этом). Память, связанная циклическими ссылками между объектами, не освобождается. Некоторая память, выделенная расширенными модулями, может не быть освобождена. Некоторые расширения могут работать неправильно, если их процедура инициализации вызывается более одного раза; это может произойти, если приложение вызоветPy_Initialize()иPy_FinalizeEx()более одного раза.Вызывает событие аудита
cpython._PySys_ClearAuditHooksбез аргументов.Добавлена в версии 3.6.
-
void Py_Finalize() -
Часть Стабильной ABI.
Обратная совместимая версия
Py_FinalizeEx(), которая игнорирует возвращаемое значение.
-
int Py_BytesMain(int argc, char **argv) -
Часть Стабильной ABI с версии 3.8.
Аналогично
Py_Main(), но argv — массив байтовых строк, позволяя вызывающему приложению делегировать задачу декодирования текста в CPython.Добавлена в версии 3.8.
-
int Py_Main(int argc, wchar_t **argv) -
Часть Стабильной ABI.
Основная программа для стандартного интерпретатора, охватывающая полный цикл инициализации/финализации, а также дополнительное поведение для чтения параметров конфигурации из среды и командной строки, а затем выполнение
__main__в соответствии с Командной строкой.Доступна для программ, которые хотят поддерживать полный интерфейс командной строки CPython, а не просто встраивать среду выполнения Python в более крупное приложение.
Параметры argc и argv аналогичны тем, которые передаются функции
main()программы на C, за исключением того, что записи argv сначала преобразуются вwchar_tс помощьюPy_DecodeLocale(). Также важно отметить, что записи списка аргументов могут быть изменены для указания на строки, отличные от переданных (однако содержимое строк, на которые указывают записи списка аргументов, не изменяется).Возвращаемое значение будет
0, если интерпретатор завершается нормально (т.е. без исключения),1, если интерпретатор завершается из-за исключения, или2, если список аргументов не представляет собой допустимую командную строку Python.Обратите внимание, что если исключение
SystemExitне обрабатывается, эта функция не вернёт1, а завершит процесс, при условии, чтоPy_InspectFlagне установлено. ЕслиPy_InspectFlagустановлено, выполнение перейдёт к интерактивному приглашению Python, в котором второй необработанныйSystemExitпо-прежнему завершит процесс, а любые другие способы завершения установят возвращаемое значение, как описано выше.С точки зрения API конфигурации среды выполнения CPython, описанных в разделе конфигурации среды выполнения (и без учёта обработки ошибок),
Py_Mainприблизительно эквивалентно:PyConfig config; PyConfig_InitPythonConfig(&config); PyConfig_SetArgv(&config, argc, argv); Py_InitializeFromConfig(&config); PyConfig_Clear(&config); Py_RunMain();
В обычном случае приложение, осуществляющее встраивание, вызовет эту функцию вместо вызова
Py_Initialize(),Py_InitializeEx()илиPy_InitializeFromConfig()непосредственно, и все настройки будут применены, как описано в других разделах данной документации. Если эта функция вызвана после предыдущего вызова API инициализации среды выполнения, то то, какие настройки конфигурации среды и командной строки будут обновлены, зависит от версии (так как это зависит от того, какие настройки правильно поддерживают модификацию после того, как они уже были установлены один раз при первоначальной инициализации среды выполнения).
-
int Py_RunMain(void) -
Выполняет основной модуль в полностью настроенной среде выполнения CPython.
Выполняет команду (
PyConfig.run_command), скрипт (PyConfig.run_filename) или модуль (PyConfig.run_module), указанный в командной строке или в конфигурации. Если ни одно из этих значений не задано, запускает интерактивное приглашение Python (REPL) с использованием глобального пространства имён модуля__main__.Если
PyConfig.inspectне установлено (по умолчанию), возвращаемое значение будет0, если интерпретатор завершается нормально (то есть без повышения исключения), или1, если интерпретатор завершается из-за исключения. Если необработанное исключениеSystemExitвозникает, функция немедленно завершит процесс вместо возврата1.Если
PyConfig.inspectустановлено (например, когда используется опция-i), вместо возврата при завершении интерпретатора выполнение возобновится в интерактивном приглашении Python (REPL) с использованием глобального пространства имён модуля__main__. Если интерпретатор завершился с исключением, оно немедленно поднимается в сессии REPL. Значение возврата функции определяется способом завершения сессии REPL: возвращение0, если сессия завершается без возникновения необработанного исключения, немедленное завершение для необработанногоSystemExit, и возвращение1для любого другого необработанного исключения.Эта функция всегда завершает интерпретатор Python независимо от того, возвращает ли она значение или немедленно завершает процесс из-за необработанного исключения
SystemExit.См. Конфигурацию Python для примера настраиваемого Python, который всегда запускается в изолированном режиме с помощью
Py_RunMain().
Параметры процесса
-
void Py_SetProgramName(const wchar_t *name) -
Часть Стабильной ABI.
Этот API сохраняется для обратной совместимости: вместо этого следует использовать установку
PyConfig.program_name, см. Конфигурация инициализации Python.Эта функция должна вызываться до первого вызова
Py_Initialize(), если она вообще вызывается. Она сообщает интерпретатору значение аргументаargv[0]функцииmain()программы (преобразованное в широкие символы). Это используется функциямиPy_GetPath()и некоторыми другими функциями ниже для поиска библиотек времени выполнения Python относительно исполняемого файла интерпретатора. Значение по умолчанию равно'python'. Аргумент должен указывать на строку широких символов с нулевым завершением в статическом хранилище, содержимое которой не будет изменено в течение выполнения программы. Никакой код интерпретатора Python не будет изменять содержимое этого хранилища.Используйте
Py_DecodeLocale()для декодирования строки байтов, чтобы получить строку wchar_*.Устарело начиная с версии 3.11.
-
wchar_t *Py_GetProgramName() -
Часть Стабильной ABI.
Возвращает имя программы, установленное с помощью
PyConfig.program_name, или значение по умолчанию. Возвращаемая строка указывает на статическое хранилище; вызывающий код не должен изменять ее значение.Эта функция не должна вызываться до
Py_Initialize(), в противном случае она возвращаетNULL.Изменено в версии 3.10: Теперь она возвращает
NULLесли вызвана доPy_Initialize().Устарело начиная с версии 3.13, будет удалено в версии 3.15: Вместо этого получите
sys.executable.
-
wchar_t *Py_GetPrefix() -
Часть Стабильной ABI.
Возвращает префикс для установки платформонезависимых файлов. Это выводится по ряду сложных правил из имени программы, установленного с помощью
PyConfig.program_name, и некоторых переменных окружения; например, если имя программы'/usr/local/bin/python', префикс равен'/usr/local'. Возвращаемая строка указывает на статическое хранилище; вызывающий код не должен изменять ее значение. Это соответствует переменной prefix в главномMakefileи аргументу--prefixскрипта configure во время сборки. Значение доступно в коде Python какsys.base_prefix. Оно полезно только в Unix. См. также следующую функцию.Эта функция не должна вызываться до
Py_Initialize(), в противном случае она возвращаетNULL.Изменено в версии 3.10: Теперь она возвращает
NULLесли вызвана доPy_Initialize().Устарело начиная с версии 3.13, будет удалено в версии 3.15: Вместо этого используйте
sys.base_prefixилиsys.prefix, если необходимо обрабатывать виртуальные среды.
-
wchar_t *Py_GetExecPrefix() -
Часть Стабильной ABI.
Возвращает exec-префикс для установки платформозависимых файлов. Это выводится по ряду сложных правил из имени программы, установленного с помощью
PyConfig.program_name, и некоторых переменных окружения; например, если имя программы'/usr/local/bin/python', exec-префикс равен'/usr/local'. Возвращаемая строка указывает на статическое хранилище; вызывающий код не должен изменять ее значение. Это соответствует переменной exec_prefix в главномMakefileи аргументу--exec-prefixскрипта configure во время сборки. Значение доступно в коде Python какsys.base_exec_prefix. Оно полезно только в Unix.Предыстория: exec-префикс отличается от префикса, когда платформозависимые файлы (такие как исполняемые файлы и общие библиотеки) устанавливаются в разных каталогах. В типичной установке платформозависимые файлы могут устанавливаться в поддереве
/usr/local/plat, а платформонезависимые - в/usr/local.В общем случае, платформа - это комбинация семейств аппаратного и программного обеспечения, например, машины Sparc, работающие под операционной системой Solaris 2.x, считаются одной платформой, но машины Intel, работающие под Solaris 2.x, являются другой платформой, а машины Intel, работающие под Linux, - еще одной платформой. Различные основные версии одной и той же операционной системы обычно также образуют разные платформы. Операционные системы, не являющиеся Unix, - это другая история; стратегии установки на этих системах настолько разные, что префикс и exec-префикс бессмысленны и устанавливаются в пустую строку. Обратите внимание, что скомпилированные файлы байткода Python платформонезависимы (но не независимы от версии Python, с помощью которой они были скомпилированы!).
Администраторы систем знают, как настроить программы mount или automount для совместного использования
/usr/localмежду платформами, при этом/usr/local/platявляется разным файловым местом для каждой платформы.Эта функция не должна вызываться до
Py_Initialize(), в противном случае она возвращаетNULL.Изменено в версии 3.10: Теперь она возвращает
NULLесли вызвана доPy_Initialize().Устарело начиная с версии 3.13, будет удалено в версии 3.15: Вместо этого используйте
sys.base_exec_prefixилиsys.exec_prefix, если необходимо обрабатывать виртуальные среды.
-
wchar_t *Py_GetProgramFullPath() -
Часть Стабильной ABI.
Возвращает полное имя исполняемого файла Python; это вычисляется как побочный эффект вывода пути поиска модулей по умолчанию из имени программы (установленного с помощью
PyConfig.program_name). Возвращаемая строка указывает на статическое хранилище; вызывающий код не должен изменять ее значение. Значение доступно в коде Python какsys.executable.Эта функция не должна вызываться до
Py_Initialize(), в противном случае она возвращаетNULL.Изменено в версии 3.10: Теперь она возвращает
NULLесли вызвана доPy_Initialize().Устарело начиная с версии 3.13, будет удалено в версии 3.15: Вместо этого используйте
sys.executable.
-
wchar_t *Py_GetPath() -
Часть Стабильной ABI.
Возвращает стандартный путь поиска модулей; он вычисляется по имени программы (установленному с помощью
PyConfig.program_name) и некоторым переменным окружения. Возвращаемая строка состоит из ряда имен каталогов, разделенных символом разделителя, зависящим от платформы. Разделитель —':'в Unix и macOS,';'в Windows. Возвращаемая строка указывает на статическое хранилище; вызывающая функция не должна изменять ее значение. Списокsys.pathинициализируется этим значением при запуске интерпретатора; его можно (и обычно изменяют) позже, чтобы изменить путь поиска при загрузке модулей.Эта функция не должна вызываться до
Py_Initialize(), в противном случае она возвращаетNULL.Изменено в версии 3.10: Теперь возвращает
NULL, если вызвана доPy_Initialize().Устарело начиная с версии 3.13, будет удалено в версии 3.15: Используйте
sys.pathвместо этого.
-
const char *Py_GetVersion() -
Часть Стабильной ABI.
Возвращает версию этой Python-интерпретатора. Это строка, которая выглядит примерно так
"3.0a5+ (py3k:63103M, May 12 2008, 00:53:55) \n[GCC 4.2.3]"
Первое слово (до первого пробела) — текущая версия Python; первые символы — основная и дополнительная версия, разделенные точкой. Возвращаемая строка указывает на статическое хранилище; вызывающая функция не должна изменять ее значение. Значение доступно коду Python как
sys.version.См. также константу
Py_Version.
-
const char *Py_GetPlatform() -
Часть Стабильной ABI.
Возвращает идентификатор платформы для текущей платформы. В Unix он формируется из «официального» имени операционной системы, преобразованного в нижний регистр, после чего следует номер основной версии; например, для Solaris 2.x, также известного как SunOS 5.x, значение равно
'sunos5'. В macOS оно равно'darwin'. В Windows оно равно'win'. Возвращаемая строка указывает на статическое хранилище; вызывающая функция не должна изменять ее значение. Значение доступно коду Python какsys.platform.
-
const char *Py_GetCopyright() -
Часть Стабильной ABI.
Возвращает официальную строку авторских прав для текущей версии Python, например
'Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam'Возвращаемая строка указывает на статическое хранилище; вызывающая функция не должна изменять ее значение. Значение доступно коду Python как
sys.copyright.
-
const char *Py_GetCompiler() -
Часть Стабильной ABI.
Возвращает указание на компилятор, использованный для построения текущей версии Python, в квадратных скобках, например:
"[GCC 2.7.2.2]"
Возвращаемая строка указывает на статическое хранилище; вызывающая функция не должна изменять ее значение. Значение доступно коду Python как часть переменной
sys.version.
-
const char *Py_GetBuildInfo() -
Часть Стабильной ABI.
Возвращает информацию о номере последовательности и дате и времени создания текущей инстанции Python-интерпретатора, например
"#67, Aug 1 1997, 22:34:28"
Возвращаемая строка указывает на статическое хранилище; вызывающая функция не должна изменять ее значение. Значение доступно коду Python как часть переменной
sys.version.
-
void PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath) -
Часть Стабильной ABI.
Этот API сохраняется для обратной совместимости: вместо этого следует использовать настройку
PyConfig.argv,PyConfig.parse_argvиPyConfig.safe_path, см. Настройка конфигурации инициализации Python.Устанавливает
sys.argvна основе argc и argv. Эти параметры аналогичны тем, которые передаются функцииmain()программы, с той разницей, что первая запись должна ссылаться на файл сценария, который будет выполняться, а не на исполняемый файл, размещающий Python-интерпретатор. Если нет сценария, который будет выполняться, первая запись в argv может быть пустой строкой. Если эта функция не удается инициализироватьsys.argv, генерируется фатальное условие с использованиемPy_FatalError().Если updatepath равно нулю, это всё, что делает функция. Если updatepath не равно нулю, функция также изменяет
sys.pathв соответствии со следующим алгоритмом:- Если имя существующего сценария передано в
argv[0], абсолютный путь к каталогу, в котором находится сценарий, добавляется в началоsys.path. - В противном случае (то есть, если argc равно
0илиargv[0]не указывает на существующее имя файла), пустая строка добавляется в началоsys.path, что равносильно добавлению текущей рабочей директории (".").
Используйте
Py_DecodeLocale()для декодирования строки байтов, чтобы получить строку wchar_*.См. также члены
PyConfig.orig_argvиPyConfig.argvструктуры Настройка конфигурации инициализации Python.Примечание
Рекомендуется, чтобы приложения, внедряющие Python-интерпретатор для целей, отличных от выполнения одного сценария, передавали
0в качестве updatepath и сами обновлялиsys.path, если это необходимо. См. CVE 2008-5983.В версиях до 3.1.3 можно добиться такого же эффекта, вручную вытащив первый элемент
sys.pathпосле вызоваPySys_SetArgv(), например, используя:PyRun_SimpleString("import sys; sys.path.pop(0)\n");Добавлен в версии 3.1.3.
Устарело начиная с версии 3.11.
- Если имя существующего сценария передано в
-
void PySys_SetArgv(int argc, wchar_t **argv) -
Часть Стабильной ABI.
Этот API сохранён для обратной совместимости: следует использовать настройку
PyConfig.argvиPyConfig.parse_argv, см. Конфигурация инициализации Python.Эта функция работает так же, как
PySys_SetArgvEx()со значением updatepath, установленным в1, если интерпретатор python не был запущен со значением-I.Для декодирования строки байтов в строку wchar_* используйте
Py_DecodeLocale().См. также
PyConfig.orig_argvиPyConfig.argvчлены Конфигурации инициализации Python.Изменено в версии 3.4: Значение updatepath зависит от
-I.Устарело начиная с версии 3.11.
-
void Py_SetPythonHome(const wchar_t *home) -
Часть Стабильной ABI.
Этот API сохранён для обратной совместимости: вместо этого следует использовать настройку
PyConfig.home, см. Конфигурация инициализации Python.Устанавливает каталог по умолчанию «home», то есть расположение стандартных библиотек Python. См.
PYTHONHOMEдля понимания значения строкового аргумента.Аргумент должен указывать на строку с нулевым завершением в статической памяти, содержимое которой не будет изменяться в течение всего выполнения программы. Никакой код в интерпретаторе Python не изменит содержимое этого хранилища.
Для декодирования строки байтов в строку wchar_* используйте
Py_DecodeLocale().Устарело начиная с версии 3.11.
-
wchar_t *Py_GetPythonHome() -
Часть Стабильной ABI.
Возвращает каталог по умолчанию «home», то есть значение, установленное
PyConfig.home, или значение переменной средыPYTHONHOME, если она установлена.Эта функция не должна вызываться до
Py_Initialize(), в противном случае она возвращаетNULL.Изменено в версии 3.10: Теперь возвращает
NULLпри вызове доPy_Initialize().Устарело начиная с версии 3.13, будет удалено в версии 3.15: Получите
PyConfig.homeили значение переменной средыPYTHONHOMEвместо этого.
Состояние потока и глобальная блокировка интерпретатора
Интерпретатор Python не является полностью потокобезопасным. Для поддержки многопоточных программ Python существует глобальная блокировка, называемая глобальной блокировкой интерпретатора или GIL, которую должен удерживать текущий поток, прежде чем он сможет безопасно получить доступ к объектам Python. Без блокировки даже простейшие операции могут привести к проблемам в многопоточной программе: например, когда два потока одновременно увеличивают счётчик ссылок одного и того же объекта, счётчик ссылок может быть увеличен только один раз вместо двух.
Поэтому существует правило, что только поток, получивший GIL, может работать с объектами Python или вызывать функции Python/C API. Для эмуляции одновременного выполнения интерпретатор регулярно пытается переключать потоки (см. sys.setswitchinterval()). Блокировка также снимается вокруг потенциально блокирующих операций ввода-вывода, таких как чтение или запись файла, чтобы другие потоки Python могли работать тем временем.
Интерпретатор Python сохраняет некоторые данные о потоках, специфичные для потока, внутри структуры данных, называемой PyThreadState. Также существует одна глобальная переменная, указывающая на текущее PyThreadState: её можно получить, используя PyThreadState_Get().
Освобождение GIL из кода расширения
Большинство кодов расширения, манипулирующих GIL, имеют следующий простой структуру:
Save the thread state in a local variable. Release the global interpreter lock. ... Do some blocking I/O operation ... Reacquire the global interpreter lock. Restore the thread state from the local variable.
Это настолько распространено, что существуют пары макросов, которые упрощают это:
Py_BEGIN_ALLOW_THREADS ... Do some blocking I/O operation ... Py_END_ALLOW_THREADS
Макрос Py_BEGIN_ALLOW_THREADS открывает новый блок и объявляет скрытую локальную переменную; макрос Py_END_ALLOW_THREADS закрывает блок.
Вышеуказанный блок расширяется до следующего кода:
PyThreadState *_save; _save = PyEval_SaveThread(); ... Do some blocking I/O operation ... PyEval_RestoreThread(_save);
Вот как работают эти функции: глобальная блокировка интерпретатора используется для защиты указателя на состояние текущего потока. При освобождении блокировки и сохранении состояния потока указатель на состояние текущего потока должен быть получен до освобождения блокировки (поскольку другой поток может немедленно получить блокировку и сохранить состояние своего потока в глобальной переменной). И наоборот, при получении блокировки и восстановлении состояния потока блокировка должна быть получена перед сохранением указателя на состояние потока.
Примечание
Вызов функций системного ввода-вывода является наиболее распространённым случаем использования для освобождения GIL, но он также может быть полезен перед вызовом длительных вычислений, которые не нуждаются в доступе к объектам Python, таких как сжатие или криптографические функции, работающие с буферами памяти. Например, стандартные модули zlib и hashlib освобождают GIL при сжатии или хешировании данных.
Потоки, созданные не из Python
Когда потоки создаются с использованием специальных API Python (например, модуля threading), состояние потока автоматически ассоциируется с ними, и показанный выше код, следовательно, корректен. Однако, когда потоки создаются из C (например, сторонней библиотекой с собственным управлением потоками), они не удерживают GIL, и для них нет структуры данных состояния потока.
Если вам нужно вызвать код Python из этих потоков (часто это часть API обратного вызова, предоставляемого упомянутой сторонней библиотекой), вы должны сначала зарегистрировать эти потоки в интерпретаторе, создав структуру данных состояния потока, затем получить GIL и, наконец, сохранить указатель на состояние их потока, прежде чем вы сможете начать использовать Python/C API. Когда вы закончите, вы должны сбросить указатель на состояние потока, освободить GIL и, наконец, освободить структуру данных состояния потока.
Функции PyGILState_Ensure() и PyGILState_Release() автоматически выполняют всё вышеперечисленное. Типичный шаблон вызова Python из C-потока выглядит так:
PyGILState_STATE gstate; gstate = PyGILState_Ensure(); /* Perform Python actions here. */ result = CallSomeFunction(); /* evaluate result or handle exception */ /* Release the thread. No Python API allowed beyond this point. */ PyGILState_Release(gstate);
Обратите внимание, что функции PyGILState_* предполагают, что существует только один глобальный интерпретатор (созданный автоматически функцией Py_Initialize()). Python поддерживает создание дополнительных интерпретаторов (с помощью Py_NewInterpreter()), но смешивание нескольких интерпретаторов и API PyGILState_* не поддерживается.
Предостережения по поводу fork()
Ещё одним важным моментом, касающимся потоков, является их поведение при вызове функции C fork(). На большинстве систем с fork(), после выполнения fork() в процессе останется только поток, который его вызвал. Это имеет практическое значение как для обработки блокировок, так и для всех сохранённых состояний в исполняемой среде CPython.
Факт, что остаётся только «текущий» поток, означает, что любые блокировки, удерживаемые другими потоками, никогда не будут освобождены. Python решает эту проблему для os.fork(), получая блокировки, используемые им внутри, перед fork() и освобождая их после. Кроме того, он сбрасывает все объекты блокировки в дочернем процессе. При расширении или встраивании Python нет способа сообщить Python о дополнительных (не-Python) блокировках, которые нужно получить перед fork() или сбросить после. Для достижения того же результата необходимо использовать средства ОС, такие как pthread_atfork(). Кроме того, при расширении или встраивании Python вызов fork() напрямую, а не через os.fork() (и возврат в или вызов в Python), может привести к тупику из-за удержания одной из внутренних блокировок Python потоком, который становится неактивным после fork(). PyOS_AfterFork_Child() пытается сбросить необходимые блокировки, но не всегда может это сделать.
Также тот факт, что все остальные потоки исчезают, означает, что состояние исполняемой среды CPython там должно быть корректно очищено, что и делает os.fork(). Это означает завершение всех других объектов PyThreadState, принадлежащих текущему интерпретатору, и всех других объектов PyInterpreterState. Из-за этого и особой природы состояния «главного» интерпретатора, fork() следует вызывать только в «главном» потоке этого интерпретатора, где была первоначально инициализирована глобальная исполняемая среда CPython. Единственное исключение – если exec() будет вызвано немедленно после этого.
Высокоуровневый API
Эти типы и функции наиболее часто используются при написании кода расширений C или при внедрении интерпретатора Python:
-
type PyInterpreterState -
Часть Ограниченного API (в качестве неявной структуры).
Эта структура данных представляет состояние, разделяемое несколькими сотрудничающими потоками. Потоки, принадлежащие одному интерпретатору, разделяют управление модулями и некоторые другие внутренние элементы. В этой структуре нет публичных членов.
Потоки, принадлежащие различным интерпретаторам, изначально ничего не разделяют, кроме состояния процесса, такого как доступная память, открытые дескрипторы файлов и т.д. Глобальная блокировка интерпретатора также делится всеми потоками независимо от того, к какому интерпретатору они принадлежат.
-
type PyThreadState -
Часть Ограниченного API (в качестве неявной структуры).
Эта структура данных представляет состояние одного потока. Единственный публичный член данных:
-
PyInterpreterState *interp -
Состояние интерпретатора этого потока.
-
-
void PyEval_InitThreads() -
Часть Стабильного ABI.
Устаревшая функция, которая ничего не делает.
В Python 3.6 и более ранних версиях эта функция создавала блокировку интерпретатора (GIL), если она не существовала.
Изменено в версии 3.9: Функция теперь ничего не делает.
Изменено в версии 3.7: Теперь эта функция вызывается функцией
Py_Initialize(), поэтому вам больше не нужно вызывать её самостоятельно.Изменено в версии 3.2: Эта функция больше не может быть вызвана до вызова
Py_Initialize().Устарела начиная с версии 3.9.
-
PyThreadState *PyEval_SaveThread() -
Часть Стабильного ABI.
Освобождает глобальную блокировку интерпретатора (если она была создана) и сбрасывает состояние потока до
NULL, возвращая предыдущее состояние потока (которое не являетсяNULL). Если блокировка была создана, текущий поток должен её иметь.
-
void PyEval_RestoreThread(PyThreadState *tstate) -
Часть Стабильного ABI.
Получает глобальную блокировку интерпретатора (если она была создана) и устанавливает состояние потока в tstate, которое не должно быть
NULL. Если блокировка была создана, текущий поток не должен её иметь, иначе произойдёт тупик.Примечание
Вызов этой функции из потока во время завершения работы среды выполнения завершит этот поток, даже если он не был создан Python. Можно использовать
Py_IsFinalizing()илиsys.is_finalizing()для проверки, находится ли интерпретатор в процессе завершения, прежде чем вызывать эту функцию, чтобы избежать нежелательного завершения.
-
PyThreadState *PyThreadState_Get() -
Часть Стабильного ABI.
Возвращает текущее состояние потока. Глобальная блокировка интерпретатора должна быть захвачена. Когда текущее состояние потока равно
NULL, это вызывает ошибку (чтобы вызывающая сторона не проверялаNULL).См. также
PyThreadState_GetUnchecked().
-
PyThreadState *PyThreadState_GetUnchecked() -
Аналогично
PyThreadState_Get(), но не убивает процесс с ошибкой, если он равен NULL. Вызывающая сторона отвечает за проверку, является ли результат NULL.Добавлена в версии 3.13: В Python 3.5–3.12 функция была приватной и известна как
_PyThreadState_UncheckedGet().
-
PyThreadState *PyThreadState_Swap(PyThreadState *tstate) -
Часть Стабильного ABI.
Меняет текущее состояние потока на состояние потока, заданное аргументом tstate, которое может быть
NULL. Глобальная блокировка интерпретатора должна быть захвачена и не высвобождается.
Следующие функции используют локальное хранилище потока и не совместимы с подинтерпретаторами:
-
PyGILState_STATE PyGILState_Ensure() -
Часть Стабильного ABI.
Убедитесь, что текущий поток готов вызвать C API Python независимо от текущего состояния Python или глобальной блокировки интерпретатора. Этот вызов можно делать сколько угодно раз, если каждый такой вызов соответствует вызову
PyGILState_Release(). В общем, другие API, связанные с потоками, можно использовать между вызовамиPyGILState_Ensure()иPyGILState_Release(), при условии, что состояние потока восстанавливается до предыдущего состояния перед вызовом Release(). Например, допустимо обычное использование макросовPy_BEGIN_ALLOW_THREADSиPy_END_ALLOW_THREADS.Возвращаемое значение — неявная «ручка» состояния потока при вызове
PyGILState_Ensure(), и она должна передаваться вPyGILState_Release()для обеспечения того, чтобы Python остался в том же состоянии. Несмотря на то, что рекурсивные вызовы разрешены, эти ручки не могут быть общими — каждый уникальный вызовPyGILState_Ensure()должен сохранить ручку для своего вызоваPyGILState_Release().По возвращении функции текущий поток будет владеть GIL и сможет вызывать произвольный Python-код. Ошибка является фатальной.
Примечание
Вызов этой функции из потока во время завершения работы среды выполнения завершит этот поток, даже если он не был создан Python. Можно использовать
Py_IsFinalizing()илиsys.is_finalizing()для проверки, находится ли интерпретатор в процессе завершения, прежде чем вызывать эту функцию, чтобы избежать нежелательного завершения.
-
void PyGILState_Release(PyGILState_STATE) -
Часть Стабильного ABI.
Освобождает ранее полученные ресурсы. После этого вызова состояние Python будет таким же, как и до соответствующего вызова
PyGILState_Ensure()(но, как правило, это состояние вызывающей стороне неизвестно, поэтому используется API GILState).Каждый вызов
PyGILState_Ensure()должен быть согласован с вызовомPyGILState_Release()в том же потоке.
-
PyThreadState *PyGILState_GetThisThreadState() -
Часть Стабильного ABI.
Получает текущее состояние потока для этого потока. Может вернуть
NULLесли для текущего потока не был использован API GILState. Обратите внимание, что основной поток всегда имеет такое состояние потока, даже если вызов auto-thread-state для основного потока не был сделан. В основном это вспомогательная/диагностическая функция.
-
int PyGILState_Check() -
Возвращает
1если текущий поток держит GIL и0в противном случае. Эту функцию можно вызвать из любого потока в любое время. Только если состояние потока Python было инициализировано и текущий поток держит GIL, она вернёт1. В основном это вспомогательная/диагностическая функция. Например, может быть полезной в контекстах обратного вызова или функциях выделения памяти, когда знание того, что GIL заблокирован, может позволить вызывающей стороне выполнить чувствительные действия или иначе вести себя по-разному.Добавлена в версии 3.4.
Следующие макросы обычно используются без точки с запятой в конце; обратите внимание на примеры использования в дистрибутиве исходного кода Python.
-
Py_BEGIN_ALLOW_THREADS -
Часть Стабильного API.
Эта макрокоманда раскрывается как
{ PyThreadState *_save; _save = PyEval_SaveThread();. Обратите внимание, что она содержит открывающую фигурную скобку; она должна быть согласована с последующей макрокомандойPy_END_ALLOW_THREADS. Более подробное обсуждение этой макрокоманды см. выше.
-
Py_END_ALLOW_THREADS -
Часть Стабильного API.
Эта макрокоманда раскрывается как
PyEval_RestoreThread(_save); }. Обратите внимание, что она содержит закрывающую фигурную скобку; она должна быть согласована с предыдущей макрокомандойPy_BEGIN_ALLOW_THREADS. Более подробное обсуждение этой макрокоманды см. выше.
-
Py_BLOCK_THREADS -
Часть Стабильного API.
Эта макрокоманда раскрывается как
PyEval_RestoreThread(_save);: она эквивалентнаPy_END_ALLOW_THREADSбез закрывающей фигурной скобки.
-
Py_UNBLOCK_THREADS -
Часть Стабильного API.
Эта макрокоманда раскрывается как
_save = PyEval_SaveThread();: она эквивалентнаPy_BEGIN_ALLOW_THREADSбез открывающей фигурной скобки и объявления переменной.
API низкого уровня
Все следующие функции должны вызываться после Py_Initialize().
Изменено в версии 3.7: Py_Initialize() теперь инициализирует GIL.
-
PyInterpreterState *PyInterpreterState_New() -
Часть Стабильной ABI.
Создаёт новый объект состояния интерпретатора. Блокировка глобального интерпретатора не требуется, но может быть взята, если необходимо сериализовать вызовы этой функции.
Вызывает событие аудита
cpython.PyInterpreterState_Newбез аргументов.
-
void PyInterpreterState_Clear(PyInterpreterState *interp) -
Часть Стабильной ABI.
Сбрасывает всю информацию в объекте состояния интерпретатора. Блокировка глобального интерпретатора должна быть взята.
Вызывает событие аудита
cpython.PyInterpreterState_Clearбез аргументов.
-
void PyInterpreterState_Delete(PyInterpreterState *interp) -
Часть Стабильной ABI.
Уничтожает объект состояния интерпретатора. Блокировка глобального интерпретатора не требуется. Состояние интерпретатора должно быть сброшено предыдущим вызовом
PyInterpreterState_Clear().
-
PyThreadState *PyThreadState_New(PyInterpreterState *interp) -
Часть Стабильной ABI.
Создаёт новый объект состояния потока, принадлежащий данному объекту интерпретатора. Блокировка глобального интерпретатора не требуется, но может быть взята, если необходимо сериализовать вызовы этой функции.
-
void PyThreadState_Clear(PyThreadState *tstate) -
Часть Стабильной ABI.
Сбрасывает всю информацию в объекте состояния потока. Блокировка глобального интерпретатора должна быть взята.
Изменено в версии 3.9: Эта функция теперь вызывает
PyThreadState.on_deleteобработчик. Ранее это происходило вPyThreadState_Delete().Изменено в версии 3.13: Обработчик
PyThreadState.on_deleteбыл удален.
-
void PyThreadState_Delete(PyThreadState *tstate) -
Часть Стабильной ABI.
Уничтожает объект состояния потока. Блокировка глобального интерпретатора не требуется. Состояние потока должно быть сброшено предыдущим вызовом
PyThreadState_Clear().
-
void PyThreadState_DeleteCurrent(void) -
Уничтожает текущее состояние потока и освобождает блокировку глобального интерпретатора. Как и в
PyThreadState_Delete(), блокировка глобального интерпретатора должна быть взята. Состояние потока должно быть сброшено предыдущим вызовомPyThreadState_Clear().
-
PyFrameObject *PyThreadState_GetFrame(PyThreadState *tstate) -
Часть Стабильной ABI с версии 3.10.
Получает текущую рамку состояния потока Python tstate.
Возвращает сильную ссылку. Возвращает
NULLесли в данный момент не выполняется никакая рамка.См. также
PyEval_GetFrame().tstate не должен быть
NULL.Добавлена в версии 3.9.
-
uint64_t PyThreadState_GetID(PyThreadState *tstate) -
Часть Стабильной ABI с версии 3.10.
Получает уникальный идентификатор состояния потока состояния потока Python tstate.
tstate не должен быть
NULL.Добавлена в версии 3.9.
-
PyInterpreterState *PyThreadState_GetInterpreter(PyThreadState *tstate) -
Часть Стабильной ABI с версии 3.10.
Получает интерпретатор состояния потока Python tstate.
tstate не должен быть
NULL.Добавлена в версии 3.9.
-
void PyThreadState_EnterTracing(PyThreadState *tstate) -
Приостанавливает отслеживание и профилирование в состоянии потока Python tstate.
Возобновить их с помощью функции
PyThreadState_LeaveTracing().Добавлена в версии 3.11.
-
void PyThreadState_LeaveTracing(PyThreadState *tstate) -
Возобновляет отслеживание и профилирование в состоянии потока Python tstate, приостановленное функцией
PyThreadState_EnterTracing().См. также функции
PyEval_SetTrace()иPyEval_SetProfile().Добавлена в версии 3.11.
-
PyInterpreterState *PyInterpreterState_Get(void) -
Часть Стабильной ABI с версии 3.9.
Получить текущий интерпретатор.
Выводит ошибку, если нет текущего состояния потока Python или текущего интерпретатора. Не может вернуть NULL.
Вызывающий должен удерживать GIL.
Добавлена в версии 3.9.
-
int64_t PyInterpreterState_GetID(PyInterpreterState *interp) -
Часть Стабильной ABI с версии 3.7.
Возвращает уникальный идентификатор интерпретатора. Если при этом возникла ошибка, возвращается
-1и устанавливается ошибка.Вызывающий должен удерживать GIL.
Добавлена в версии 3.7.
-
PyObject *PyInterpreterState_GetDict(PyInterpreterState *interp) -
Часть Стабильной ABI с версии 3.8.
Возвращает словарь, в котором может храниться информация, специфичная для интерпретатора. Если эта функция возвращает
NULL, то исключение не было возбуждено, и вызывающая сторона должна предположить, что словарь, специфичный для интерпретатора, недоступен.Это не замена для
PyModule_GetState(), которую расширения должны использовать для хранения информации о состоянии, специфичной для интерпретатора.Добавлена в версии 3.8.
-
typedef PyObject *(*_PyFrameEvalFunction)(PyThreadState *tstate, _PyInterpreterFrame *frame, int throwflag) -
Тип функции оценки кадра.
Параметр throwflag используется методом
throw()генераторов: если ненулевой, обрабатывает текущее исключение.Изменено в версии 3.9: Функция теперь принимает параметр tstate.
Изменено в версии 3.11: Параметр frame изменён с
PyFrameObject*на_PyInterpreterFrame*.
-
_PyFrameEvalFunction _PyInterpreterState_GetEvalFrameFunc(PyInterpreterState *interp) -
Получить функцию оценки кадра.
См. PEP 523 «Добавление API оценки кадра в CPython».
Добавлена в версии 3.9.
-
void _PyInterpreterState_SetEvalFrameFunc(PyInterpreterState *interp, _PyFrameEvalFunction eval_frame) -
Установить функцию оценки кадра.
См. PEP 523 «Добавление API оценки кадра в CPython».
Добавлена в версии 3.9.
-
PyObject *PyThreadState_GetDict() -
Значение возвращаемого значения: Заимствованная ссылка. Часть Стабильного ABI.
Возвращает словарь, в котором расширения могут хранить информацию о состоянии, специфичном для потока. Каждое расширение должно использовать уникальный ключ для хранения состояния в словаре. Вызов этой функции допустим, когда состояние текущего потока недоступно. Если эта функция возвращает
NULL, исключение не было возбуждено, и вызывающая сторона должна предположить, что состояние текущего потока недоступно.
-
int PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc) -
Часть Стабильного ABI.
Асинхронно возбуждает исключение в потоке. Аргумент id — это идентификатор целевого потока; exc — это объект исключения, который нужно возбудить. Эта функция не захватывает ссылки на exc. Для предотвращения неосторожного использования необходимо написать собственное расширение C для вызова этой функции. Должен вызываться с захваченным GIL. Возвращает количество изменённых состояний потоков; обычно это единица, но будет нулём, если идентификатор потока не найден. Если exc равно
NULL, ожидаемое исключение (если оно есть) для потока очищается. Исключений не возбуждается.Изменено в версии 3.7: Тип параметра id изменён с long на unsigned long.
-
void PyEval_AcquireThread(PyThreadState *tstate) -
Часть Стабильного ABI.
Захватывает глобальную блокировку интерпретатора и устанавливает состояние текущего потока на tstate, которое не должно быть
NULL. Блокировка должна быть создана ранее. Если этот поток уже имеет блокировку, возникает тупик.Примечание
Вызов этой функции из потока, когда среда выполнения завершается, приведёт к завершению потока, даже если поток не был создан Python. Вы можете использовать
Py_IsFinalizing()илиsys.is_finalizing(), чтобы проверить, завершается ли интерпретатор, перед вызовом этой функции, чтобы избежать нежелательного завершения.Изменено в версии 3.8: Обновлено для соответствия
PyEval_RestoreThread(),Py_END_ALLOW_THREADS()иPyGILState_Ensure()и завершит текущий поток, если вызов произойдёт, когда интерпретатор завершается.PyEval_RestoreThread()— это функция более высокого уровня, которая всегда доступна (даже когда потоки не были инициализированы).
-
void PyEval_ReleaseThread(PyThreadState *tstate) -
Часть Стабильного ABI.
Сбрасывает состояние текущего потока на
NULLи освобождает глобальную блокировку интерпретатора. Блокировка должна быть создана ранее и должна быть захвачена текущим потоком. Аргумент tstate, который не должен бытьNULL, используется только для проверки, представляет ли он состояние текущего потока; если нет, генерируется критическое сообщение об ошибке.PyEval_SaveThread()— это функция более высокого уровня, которая всегда доступна (даже когда потоки не были инициализированы).
Поддержка под-интерпретаторов
Хотя в большинстве случаев вы будете встраивать только один интерпретатор Python, существуют случаи, когда вам нужно создать несколько независимых интерпретаторов в одном процессе и, возможно, даже в одном потоке. Под-интерпретаторы позволяют это сделать.
«Главный» интерпретатор — это первый созданный, когда среда выполнения инициализируется. Обычно это единственный интерпретатор Python в процессе. В отличие от под-интерпретаторов, главный интерпретатор несёт уникальную ответственность на уровне всего процесса, например, обработку сигналов. Он также отвечает за выполнение во время инициализации среды выполнения и обычно является активным интерпретатором во время завершения среды выполнения. Функция PyInterpreterState_Main() возвращает указатель на его состояние.
Переключение между под-интерпретаторами осуществляется с помощью функции PyThreadState_Swap(). Их создание и уничтожение осуществляются с помощью следующих функций:
-
type PyInterpreterConfig -
Структура, содержащая большинство параметров для настройки под-интерпретатора. Её значения используются только в
Py_NewInterpreterFromConfig()и никогда не изменяются средой выполнения.Добавлена в версии 3.12.
Поля структуры:
-
int use_main_obmalloc -
Если это
0, под-интерпретатор будет использовать своё собственное состояние выделения «объектов». В противном случае он будет использовать (совместно) состояние главного интерпретатора.Если это
0, тоcheck_multi_interp_extensionsдолжно быть1(не равно нулю). Если это1, тоgilне должно бытьPyInterpreterConfig_OWN_GIL.
-
int allow_fork -
Если это
0, среда выполнения не будет поддерживать создание форка процесса ни в одном потоке, где в данный момент активен под-интерпретатор. В противном случае форк разрешён без ограничений.Обратите внимание, что модуль
subprocessпо-прежнему работает, когда форк запрещён.
-
int allow_exec -
Если это
0, среда выполнения не будет поддерживать замену текущего процесса с помощью exec (например,os.execv()) ни в одном потоке, где в данный момент активен под-интерпретатор. В противном случае exec разрешён без ограничений.Обратите внимание, что модуль
subprocessпо-прежнему работает, когда exec запрещён.
-
int allow_threads -
Если это
0, модульthreadingпод-интерпретатора не будет создавать потоки. В противном случае потоки разрешены.
-
int allow_daemon_threads -
Если это
0, модульthreadingпод-интерпретатора не будет создавать демонические потоки. В противном случае демонические потоки разрешены (при условии, чтоallow_threadsне равно нулю).
-
int check_multi_interp_extensions -
Если это
0, все модули расширений могут быть импортированы, включая устаревшие (инициализируемые в одноэтапном режиме) модули, в любом потоке, где в данный момент активен под-интерпретатор. В противном случае могут быть импортированы только модули расширений с многоэтапной инициализацией (см. PEP 489). (См. такжеPy_mod_multiple_interpreters.)Должно быть
1(не равно нулю), еслиuse_main_obmallocравно0.
-
int gil -
Это определяет работу GIL для под-интерпретатора. Может принимать одно из следующих значений:
-
PyInterpreterConfig_DEFAULT_GIL -
Использовать стандартный выбор (
PyInterpreterConfig_SHARED_GIL).
-
PyInterpreterConfig_SHARED_GIL -
Использовать (совместно) GIL главного интерпретатора.
-
PyInterpreterConfig_OWN_GIL -
Использовать собственный GIL под-интерпретатора.
Если это
PyInterpreterConfig_OWN_GIL, тоPyInterpreterConfig.use_main_obmallocдолжно быть0. -
-
-
PyStatus Py_NewInterpreterFromConfig(PyThreadState **tstate_p, const PyInterpreterConfig *config) -
Создание нового подинтерпретатора. Это (почти) полностью отделенная среда для выполнения кода Python. В частности, у нового интерпретатора есть отдельные, независимые версии всех импортированных модулей, включая фундаментальные модули
builtins,__main__иsys. Таблица загруженных модулей (sys.modules) и путь поиска модулей (sys.path) также отдельные. Новая среда не имеет переменнойsys.argv. Она имеет новые стандартные объекты файлов потоков ввода/выводаsys.stdin,sys.stdoutиsys.stderr(однако они ссылаются на те же самые основанные файловые дескрипторы).Указанная переменная config управляет параметрами, с которыми инициализируется интерпретатор.
При успехе, tstate_p будет установлен на первый созданный поток состояния в новом подинтерпретаторе. Это состояние потока создается в текущем состоянии потока. Обратите внимание, что фактический поток не создается; см. обсуждение состояний потоков ниже. Если создание нового интерпретатора не удалось, tstate_p устанавливается в
NULL; исключение не устанавливается, поскольку состояние исключения хранится в текущем состоянии потока, и текущего состояния потока может и не быть.Как и все другие функции API Python/C, блокировка глобального интерпретатора должна быть захвачена перед вызовом этой функции и все еще захвачена, когда она возвращается. Аналогично, текущее состояние потока должно быть установлено при входе. При успехе, возвращенное состояние потока будет установлено как текущее. Если подинтерпретатор создается со своим собственным GIL, то GIL вызывающего интерпретатора будет освобожден. Когда функция возвращается, GIL нового интерпретатора будет захвачен текущим потоком, а GIL предыдущего интерпретатора останется освобожденным здесь.
Добавлен в версии 3.12.
Подинтерпретаторы наиболее эффективны, когда изолированы друг от друга, с ограничениями определенных функций:
PyInterpreterConfig config = { .use_main_obmalloc = 0, .allow_fork = 0, .allow_exec = 0, .allow_threads = 1, .allow_daemon_threads = 0, .check_multi_interp_extensions = 1, .gil = PyInterpreterConfig_OWN_GIL, }; PyThreadState *tstate = NULL; PyStatus status = Py_NewInterpreterFromConfig(&tstate, &config); if (PyStatus_Exception(status)) { Py_ExitStatusException(status); }Обратите внимание, что конфигурация используется только кратковременно и не изменяется. Во время инициализации значения конфигурации преобразуются в различные значения
PyInterpreterState. Чтение-только копия конфигурации может храниться внутри наPyInterpreterState.Модули расширений совместно используются между (под-)интерпретаторами следующим образом:
- Для модулей, использующих многофазную инициализацию, например,
PyModule_FromDefAndSpec(), отдельный объект модуля создается и инициализируется для каждого интерпретатора. Только статические и глобальные переменные на уровне C совместно используются между этими объектами модулей. -
Для модулей, использующих однофазную инициализацию, например,
PyModule_Create(), при первом импорте определенного расширения оно инициализируется обычно, и (поверхностная) копия словаря модуля скрывается. Когда то же расширение импортируется другим (под-)интерпретатором, новый модуль инициализируется и заполняется содержимым этой копии; функция расширенияinitне вызывается. Объекты в словаре модуля, таким образом, делятся между (под-)интерпретаторами, что может привести к нежелаемому поведению (см. Ошибки и замечания ниже).Обратите внимание, что это отличается от того, что происходит, когда расширение импортируется после того, как интерпретатор был полностью повторно инициализирован вызовом
Py_FinalizeEx()иPy_Initialize(); в этом случае функция расширенияinitmoduleвызывается снова. Как и при многофазной инициализации, это означает, что только статические и глобальные переменные на уровне C совместно используются между этими модулями.
- Для модулей, использующих многофазную инициализацию, например,
-
PyThreadState *Py_NewInterpreter(void) -
Часть Стабильной ABI.
Создание нового подинтерпретатора. Это по существу просто обёртка вокруг
Py_NewInterpreterFromConfig()с конфигурацией, сохраняющей существующее поведение. Результатом является неизолированный подинтерпретатор, который разделяет GIL основного интерпретатора, допускает fork/exec, разрешает работу демонов-потоков и разрешает модули с однофазной инициализацией.
-
void Py_EndInterpreter(PyThreadState *tstate) -
Часть Стабильной ABI.
Уничтожение (под-)интерпретатора, представленного заданным состоянием потока. Заданное состояние потока должно быть текущим состоянием потока. См. обсуждение состояний потоков ниже. Когда вызов возвращается, текущее состояние потока —
NULL. Все состояния потоков, связанные с этим интерпретатором, уничтожаются. Блокировка глобального интерпретатора, используемая целевым интерпретатором, должна быть захвачена перед вызовом этой функции. GIL не захвачен при возвращении.Py_FinalizeEx()уничтожит все подинтерпретаторы, которые не были явно уничтожены на этом этапе.
GIL на уровне интерпретатора
Используя Py_NewInterpreterFromConfig() вы можете создать подинтерпретатор, который полностью изолирован от других интерпретаторов, в том числе имея собственный GIL. Наиболее важная выгода от этой изоляции состоит в том, что такой интерпретатор может выполнять код Python без блокировки другими интерпретаторами или блокирования каких-либо других. Таким образом, один процесс Python может по-настоящему использовать преимущества нескольких ядер процессора при выполнении кода Python. Изоляция также поощряет другой подход к параллелизму, чем просто использование потоков. (См. PEP 554.)
Использование изолированного интерпретатора требует бдительности в сохранении этой изоляции. Это особенно относится к несовместному использованию каких-либо объектов или изменяемых состояний без гарантий потокобезопасности. Даже объекты, которые в противном случае неизменяемы (например, None, (1, 5)) обычно не могут быть совместно использованы из-за счетчика ссылок. Один простой, но менее эффективный подход заключается в использовании глобальной блокировки вокруг всего использования какого-либо состояния (или объекта). Альтернативно, эффективно неизменяемые объекты (например, целые числа или строки) могут быть защищены несмотря на счетчики ссылок, сделав их бессмертными. На самом деле, это было сделано для встроенных одиночных объектов, малых целых чисел и ряда других встроенных объектов.
Если вы сохраняете изоляцию, то получите доступ к правильному многоядерному вычислению без сложностей, связанных с свободными потоками. Несоблюдение изоляции приведет вас к полным последствиям свободных потоков, включая гонки и трудноотлаживаемые сбои.
Помимо этого, одной из основных проблем при использовании нескольких изолированных интерпретаторов является то, как безопасно (не нарушить изоляцию) и эффективно обмениваться данными между ними. В рамках среды выполнения и стандартной библиотеки пока нет стандартного подхода к этому. Будущий модуль стандартной библиотеки поможет снизить усилия по сохранению изоляции и предоставит эффективные инструменты для обмена данными (и совместного использования) между интерпретаторами.
Добавлен в версии 3.12.
Ошибки и замечания
Поскольку подинтерпретаторы (и основной интерпретатор) являются частью одного процесса, изоляция между ними не является идеальной — например, при использовании низкоуровневых файловых операций, таких как os.close(), они могут (случайно или преднамеренно) влиять на открытые файлы друг друга. Из-за того, как расширения совместно используются между (под-)интерпретаторами, некоторые расширения могут работать некорректно; это особенно вероятно при использовании однофазной инициализации или (статических) глобальных переменных. Возможна вставка объектов, созданных в одном подинтерпретаторе, в пространство имен другого (под-)интерпретатора; этого следует избегать, если это возможно.
Особое внимание следует уделить тому, чтобы не совместно использовать пользовательские функции, методы, экземпляры или классы между подинтерпретаторами, так как операции импорта, выполняемые такими объектами, могут повлиять на словарь загруженных модулей не того (под-)интерпретатора. Также важно избегать совместного использования объектов, которые можно достичь от вышеперечисленных.
Также обратите внимание, что сочетание этой функциональности с API PyGILState_* является деликатным, так как эти API предполагают взаимно-однозначное соответствие между состояниями потоков Python и потоками на уровне операционной системы, предположение, которое нарушается при наличии подинтерпретаторов. Настоятельно рекомендуется не переключаться между подинтерпретаторами между парой вызовов PyGILState_Ensure() и PyGILState_Release(). Кроме того, расширения (например, ctypes) использующие эти API для вызова кода Python из потоков, созданных не из Python, вероятно, будут нарушены при использовании подинтерпретаторов.
Асинхронные уведомления
Предоставляется механизм для асинхронных уведомлений основному интерпретатору. Эти уведомления представляют собой указатель на функцию и аргумент типа указателя на void.
-
int Py_AddPendingCall(int (*func)(void*), void *arg) -
Часть Стабильной ABI.
Планирует вызов функции из основного потока интерпретатора. При успехе возвращается
0, а func добавляется в очередь для вызова в основном потоке. При неудаче возвращается-1, не устанавливая никаких исключений.После успешного добавления в очередь, func будет в конечном итоге вызвана из основного потока интерпретатора с аргументом arg. Она будет вызвана асинхронно по отношению к обычному выполнению Python-кода, но с соблюдением следующих условий:
- на границе байткода;
- с основным потоком, удерживающим глобальную блокировку интерпретатора (func может, следовательно, использовать весь C API).
func должна возвращать
0при успехе или-1при неудаче с установленным исключением. func не будет прервана для выполнения другого асинхронного уведомления рекурсивно, но она может быть прервана для переключения потоков, если глобальная блокировка интерпретатора освобождена.Для работы этой функции не нужен текущий состояние потока, и ей не нужна глобальная блокировка интерпретатора.
Чтобы вызвать эту функцию в подинтерпретаторе, вызывающий поток должен удерживать GIL. В противном случае функция func может быть запланирована для вызова из неправильного интерпретатора.
Предупреждение
Это функция низкого уровня, полезная только в очень особых случаях. Нет гарантии, что func будет вызвана как можно быстрее. Если основной поток занят выполнением системного вызова, func не будет вызвана до возврата из системного вызова. Эта функция, как правило, не подходит для вызова Python-кода из произвольных C-потоков. Вместо этого используйте API PyGILState.
Добавлена в версии 3.1.
Изменено в версии 3.9: Если эта функция вызывается в подинтерпретаторе, функция func теперь запланирована для вызова из подинтерпретатора, а не из основного интерпретатора. Каждый подинтерпретатор теперь имеет свой собственный список запланированных вызовов.
Профилирование и отслеживание
Интерпретатор Python предоставляет некоторую низкоуровневую поддержку для подключения средств профилирования и отслеживания выполнения. Они используются для профилирования, отладки и анализа покрытия.
Этот C-интерфейс позволяет коду профилирования или отслеживания избежать накладных расходов вызовов через вызываемые объекты уровня Python, вместо этого делая прямой вызов C-функции. Существенные атрибуты средства не изменились; интерфейс позволяет устанавливать функции отслеживания на поток и базовые события, сообщаемые функции отслеживания, такие же, как и сообщались функциям отслеживания уровня Python в предыдущих версиях.
-
typedef int (*Py_tracefunc)(PyObject *obj, PyFrameObject *frame, int what, PyObject *arg) -
Тип функции отслеживания, зарегистрированной с помощью
PyEval_SetProfile()иPyEval_SetTrace(). Первый параметр — объект, переданный функции регистрации как obj, frame — объект фрейма, к которому относится событие, what — одна из константPyTrace_CALL,PyTrace_EXCEPTION,PyTrace_LINE,PyTrace_RETURN,PyTrace_C_CALL,PyTrace_C_EXCEPTION,PyTrace_C_RETURNилиPyTrace_OPCODE, а arg зависит от значения what:Значение what
Значение arg
Всегда
Py_None.Информация об исключении, возвращаемая
sys.exc_info().Всегда
Py_None.Возвращаемое значение вызывающей функции или
NULL, если вызвано исключение.Объект функции, который вызывается.
Объект функции, который вызывается.
Объект функции, который вызывается.
Всегда
Py_None.
-
int PyTrace_CALL -
Значение параметра what для функции
Py_tracefuncпри сообщении о новом вызове функции или метода, или новом входе в генератор. Обратите внимание, что создание итератора для функции-генератора не сообщается, так как нет передачи управления в байт-код Python в соответствующем фрейме.
-
int PyTrace_EXCEPTION -
Значение параметра what для функции
Py_tracefuncпри возникновении исключения. Функция обратного вызова вызывается с этим значением для what после обработки любого байткода, после чего исключение устанавливается в выполняемом фрейме. В результате, по мере того как распространение исключения приводит к развёртыванию стека Python, обратный вызов вызывается при возвращении в каждый фрейм по мере распространения исключения. Только функции отслеживания получают эти события; они не нужны профилеру.
-
int PyTrace_LINE -
Значение, переданное в качестве параметра what функции
Py_tracefunc(но не функции профилирования) при сообщении о событии номера строки. Его можно отключить для фрейма, установивf_trace_linesв 0 в этом фрейме.
-
int PyTrace_RETURN -
Значение для параметра what для функций
Py_tracefuncпри приближении к возврату из вызова.
-
int PyTrace_C_CALL -
Значение для параметра what для функций
Py_tracefuncпри вызове C-функции.
-
int PyTrace_C_EXCEPTION -
Значение для параметра what для функций
Py_tracefuncпри возникновении исключения в C-функции.
-
int PyTrace_C_RETURN -
Значение для параметра what для функций
Py_tracefuncпри возвращении из C-функции.
-
int PyTrace_OPCODE -
Значение для параметра what для функций
Py_tracefunc(но не для функций профилирования) при выполнении нового оператора. Это событие не генерируется по умолчанию: его необходимо явно запросить, установивf_trace_opcodesв 1 в фрейме.
-
void PyEval_SetProfile(Py_tracefunc func, PyObject *obj) -
Устанавливает функцию профилирования на func. Параметр obj передаётся функции в качестве первого параметра и может быть любым объектом Python или
NULL. Если функции профилирования нужно поддерживать состояние, использование разных значений obj для каждого потока предоставляет удобное и безопасное для потоков место для его хранения. Функция профилирования вызывается для всех отслеживаемых событий, кромеPyTrace_LINEPyTrace_OPCODEиPyTrace_EXCEPTION.См. также функцию
sys.setprofile().Вызывающая сторона должна удерживать GIL.
-
void PyEval_SetProfileAllThreads(Py_tracefunc func, PyObject *obj) -
Подобно
PyEval_SetProfile(), но устанавливает функцию профилирования во всех работающих потоках, принадлежащих текущей интерпретации, вместо установки только в текущем потоке.Вызывающая сторона должна удерживать GIL.
Как и
PyEval_SetProfile(), эта функция игнорирует любые исключения, возникающие при установке функций профилирования во всех потоках.
Добавлена в версии 3.12.
-
void PyEval_SetTrace(Py_tracefunc func, PyObject *obj) -
Устанавливает функцию отслеживания на func. Это аналогично
PyEval_SetProfile(), за исключением того, что функция отслеживания получает события номеров строк и события по операторам, но не получает никаких событий, связанных с вызовами C-функций. Любая функция отслеживания, зарегистрированная с помощьюPyEval_SetTrace(), не будет получатьPyTrace_C_CALL,PyTrace_C_EXCEPTIONилиPyTrace_C_RETURNв качестве значения параметра what.См. также функцию
sys.settrace().Вызывающая сторона должна удерживать GIL.
-
void PyEval_SetTraceAllThreads(Py_tracefunc func, PyObject *obj) -
Подобно
PyEval_SetTrace(), но устанавливает функцию отслеживания для всех запущенных потоков, принадлежащих текущему интерпретатору, а не только для текущего потока.Вызывающий код должен удерживать GIL.
Как и
PyEval_SetTrace(), эта функция игнорирует любые исключения, возникающие при установке функций отслеживания во всех потоках.
Добавлен в версии 3.12.
Отслеживание ссылок
Добавлен в версии 3.13.
-
typedef int (*PyRefTracer)(PyObject*, int event, void *data) -
Тип функции отслеживания, зарегистрированной с помощью
PyRefTracer_SetTracer(). Первый параметр — это объект Python, который был только что создан (когда event установлен вPyRefTracer_CREATE) или собирается быть уничтожен (когда event установлен вPyRefTracer_DESTROY). Аргумент data — это непрозрачный указатель, который был предоставлен при вызовеPyRefTracer_SetTracer().
Добавлен в версии 3.13.
-
int PyRefTracer_CREATE -
Значение для параметра event функций
PyRefTracer, когда объект Python был создан.
-
int PyRefTracer_DESTROY -
Значение для параметра event функций
PyRefTracer, когда объект Python был уничтожен.
-
int PyRefTracer_SetTracer(PyRefTracer tracer, void *data) -
Регистрирует функцию отслеживания ссылок. Функция будет вызываться при создании нового объекта Python или при уничтожении объекта. Если data указан, он должен быть непрозрачным указателем, который будет передан при вызове функции отслеживания. Возвращает
0при успехе. Устанавливает исключение и возвращает-1при ошибке.Обратите внимание, что функции отслеживания не должны создавать объекты Python внутри себя или вызов будет рекурсивным. Функция отслеживания также не должна очищать существующие исключения или устанавливать исключение. GIL будет удерживаться каждый раз при вызове функции отслеживания.
При вызове этой функции должен удерживаться GIL.
Добавлен в версии 3.13.
-
PyRefTracer PyRefTracer_GetTracer(void **data) -
Получает зарегистрированную функцию отслеживания ссылок и значение непрозрачного указателя данных, зарегистрированного при вызове
PyRefTracer_SetTracer(). Если функция отслеживания не была зарегистрирована, эта функция вернёт NULL и установит указатель data в NULL.При вызове этой функции должен удерживаться GIL.
Добавлен в версии 3.13.
Поддержка расширенных отладчиков
Эти функции предназначены только для использования расширенными отладчиками.
-
PyInterpreterState *PyInterpreterState_Head() -
Возвращает объект состояния интерпретатора в начале списка всех таких объектов.
-
PyInterpreterState *PyInterpreterState_Main() -
Возвращает основной объект состояния интерпретатора.
-
PyInterpreterState *PyInterpreterState_Next(PyInterpreterState *interp) -
Возвращает следующий объект состояния интерпретатора после interp из списка всех таких объектов.
-
PyThreadState *PyInterpreterState_ThreadHead(PyInterpreterState *interp) -
Возвращает указатель на первый объект
PyThreadStateв списке потоков, связанных с интерпретатором interp.
-
PyThreadState *PyThreadState_Next(PyThreadState *tstate) -
Возвращает следующий объект состояния потока после tstate из списка всех таких объектов, принадлежащих тому же объекту
PyInterpreterState.
Поддержка локального хранилища потоков
Интерпретатор Python предоставляет низкоуровневую поддержку локального хранилища потоков (TLS), которая оборачивает базовую реализацию нативного TLS для поддержки API локального хранилища потоков на уровне Python (threading.local). C-уровневые API CPython похожи на те, что предлагаются pthreads и Windows: используется ключ потока и функции для связывания значения void* с каждым потоком.
При вызове этих функций флаг блокировки глобального интерпретатора (GIL) не требуется; они обеспечивают свою собственную блокировку.
Обратите внимание, что Python.h не включает объявление API TLS, вам необходимо включить pythread.h для использования локального хранилища потоков.
Примечание
Ни одна из этих функций API не обрабатывает управление памятью от имени значений void*. Вам необходимо выделять и освобождать их самостоятельно. Если значения void* являются PyObject*, эти функции также не выполняют операции с счётчиком ссылок.
API локального хранилища потоков (TSS)
API TSS был введен для замены использования существующего API TLS в интерпретаторе CPython. Этот API использует новый тип Py_tss_t вместо int для представления ключей потоков.
Добавлена в версии 3.7.
См. также
«Новый C-API для локального хранилища потоков в CPython» (PEP 539)
-
type Py_tss_t -
Эта структура данных представляет состояние ключа потока, определение которого может зависеть от реализации базового TLS, и она содержит внутреннее поле, представляющее состояние инициализации ключа. В этой структуре нет публичных членов.
Когда Py_LIMITED_API не определён, статическое выделение этого типа с помощью
Py_tss_NEEDS_INITразрешено.
-
Py_tss_NEEDS_INIT -
Эта макрокоманда расширяется до инициализатора для переменных
Py_tss_t. Обратите внимание, что эта макрокоманда не будет определена с Py_LIMITED_API.
Динамическое выделение
Динамическое выделение Py_tss_t, необходимое в модулях расширения, построенных с Py_LIMITED_API, где статическое выделение этого типа невозможно из-за того, что его реализация невидима на этапе компиляции.
-
Py_tss_t *PyThread_tss_alloc() -
Часть Стабильной ABI с версии 3.7.
Возвращает значение, совпадающее со значением, инициализированным с помощью
Py_tss_NEEDS_INIT, илиNULLв случае неудачи динамического выделения.
-
void PyThread_tss_free(Py_tss_t *key) -
Часть Стабильной ABI с версии 3.7.
Освобождает данный ключ, выделенный функцией
PyThread_tss_alloc(), после предварительного вызоваPyThread_tss_delete()для обеспечения того, что все связанные локальные данные потоков были отвязаны. Это бесполезная операция, если аргумент ключ равенNULL.Примечание
Освобожденный ключ становится висячей ссылкой. Вы должны сбросить ключ до
NULL.
Методы
Параметр ключ этих функций не должен быть NULL. Кроме того, поведение функций PyThread_tss_set() и PyThread_tss_get() не определено, если данный Py_tss_t не был инициализирован функцией PyThread_tss_create().
-
int PyThread_tss_is_created(Py_tss_t *key) -
Часть Стабильной ABI с версии 3.7.
Возвращает ненулевое значение, если данный
Py_tss_tбыл инициализирован функциейPyThread_tss_create().
-
int PyThread_tss_create(Py_tss_t *key) -
Часть Стабильной ABI с версии 3.7.
Возвращает нулевое значение при успешной инициализации ключа TSS. Поведение не определено, если значение, на которое указывает аргумент ключ, не инициализировано с помощью
Py_tss_NEEDS_INIT. Эту функцию можно вызывать многократно для одного и того же ключа; её вызов для уже инициализированного ключа является бесполезной операцией и немедленно возвращает успех.
-
void PyThread_tss_delete(Py_tss_t *key) -
Часть Стабильной ABI с версии 3.7.
Уничтожает ключ TSS, чтобы забыть значения, связанные с ключом во всех потоках, и изменить состояние инициализации ключа на неинициализированное. Уничтоженный ключ может быть повторно инициализирован с помощью
PyThread_tss_create(). Эту функцию можно вызывать многократно для одного и того же ключа; её вызов для уже уничтоженного ключа является бесполезной операцией.
-
int PyThread_tss_set(Py_tss_t *key, void *value) -
Часть Стабильной ABI с версии 3.7.
Возвращает нулевое значение, чтобы указать успешное связывание значения void* с ключом TSS в текущем потоке. Каждый поток имеет отличное отображение ключа на значение void*.
-
void *PyThread_tss_get(Py_tss_t *key) -
Часть Стабильной ABI с версии 3.7.
Возвращает значение void*, связанное с ключом TSS в текущем потоке. Возвращает
NULL, если с ключом в текущем потоке не связано никакого значения.
API локального хранения данных для потоков (TLS)
Устарело начиная с версии 3.7: Этот API устарел и заменён на API хранения данных для конкретных потоков (TSS).
Примечание
Эта версия API не поддерживает платформы, где ключ нативного TLS определён таким образом, что его нельзя безопасно привести к типу int. На таких платформах, PyThread_create_key() вернёт немедленный результат с ошибкой, а остальные функции TLS будут пустыми операциями на таких платформах.
Из-за проблемы совместимости, упомянутой выше, эту версию API не следует использовать в новом коде.
-
int PyThread_create_key() - Часть Стабильной ABI.
-
void PyThread_delete_key(int key) - Часть Стабильной ABI.
-
int PyThread_set_key_value(int key, void *value) - Часть Стабильной ABI.
-
void *PyThread_get_key_value(int key) - Часть Стабильной ABI.
-
void PyThread_delete_key_value(int key) - Часть Стабильной ABI.
-
void PyThread_ReInitTLS() - Часть Стабильной ABI.
Примитивы синхронизации
C-API предоставляет базовый мьютекс.
-
type PyMutex -
Мьютекс взаимного исключения.
PyMutexдолжен быть инициализирован нулём, чтобы представлять разблокированное состояние. Например:PyMutex mutex = {0};Экземпляры
PyMutexне должны копироваться или перемещаться. И содержимое, и адресPyMutexзначимы, и он должен оставаться в фиксированном, доступном для записи месте в памяти.Примечание
PyMutexв настоящее время занимает один байт, но размер считается неустойчивым. Размер может измениться в будущих выпусках Python без периода устаревания.Добавлен в версии 3.13.
-
void PyMutex_Lock(PyMutex *m) -
Заблокировать мьютекс m. Если другой поток уже заблокировал его, вызывающий поток будет заблокирован до тех пор, пока мьютекс не будет разблокирован. Во время блокировки поток временно освободит GIL, если он удерживается.
Добавлен в версии 3.13.
-
void PyMutex_Unlock(PyMutex *m) -
Разблокировать мьютекс m. Мьютекс должен быть заблокирован — в противном случае функция вызовет ошибку.
Добавлен в версии 3.13.
API критических секций Python
API критических секций обеспечивает механизм предотвращения тупиков поверх блокировок на уровне объектов для беспоточных CPython. Они предназначены для замены использования глобальной блокировки интерпретатора и являются пустыми операциями в версиях Python с глобальной блокировкой интерпретатора.
Критические секции предотвращают тупики, неявно приостанавливая активные критические секции и освобождая блокировки во время вызовов PyEval_SaveThread(). Когда вызывается PyEval_RestoreThread(), последняя критическая секция возобновляется, и её блокировки повторно приобретаются. Это означает, что API критических секций предоставляет более слабые гарантии, чем традиционные блокировки — они полезны, потому что их поведение аналогично поведению GIL.
Функции и структуры, используемые макросами, экспортируются для случаев, когда C-макросы недоступны. Их следует использовать только в приведённых расширениях макросов. Обратите внимание, что размеры и содержимое структур могут меняться в будущих версиях Python.
Примечание
Операции, которые должны блокировать два объекта одновременно, должны использовать Py_BEGIN_CRITICAL_SECTION2. Вы не можете использовать вложенные критические секции для блокировки более одного объекта одновременно, потому что внутренняя критическая секция может приостановить внешние критические секции. Этот API не предоставляет способ блокировки более двух объектов одновременно.
Пример использования:
static PyObject *
set_field(MyObject *self, PyObject *value)
{
Py_BEGIN_CRITICAL_SECTION(self);
Py_SETREF(self->field, Py_XNewRef(value));
Py_END_CRITICAL_SECTION();
Py_RETURN_NONE;
}
В приведённом примере, вызов Py_SETREF вызывает Py_DECREF, что может вызвать произвольный код через функцию удаления объекта. API критических секций предотвращает потенциальные тупики из-за рекурсии и порядка блокировок, позволяя времени выполнения временно приостановить критическую секцию, если код, вызванный финализатором, блокируется и вызывает PyEval_SaveThread().
-
Py_BEGIN_CRITICAL_SECTION(op) -
Приобретает блокировку на уровне объекта для объекта op и начинает критическую секцию.
В беспоточном варианте этот макрос расширяется до:
{ PyCriticalSection _py_cs; PyCriticalSection_Begin(&_py_cs, (PyObject*)(op))В стандартном варианте этот макрос расширяется до
{.Добавлен в версии 3.13.
-
Py_END_CRITICAL_SECTION() -
Заканчивает критическую секцию и освобождает блокировку на уровне объекта.
В беспоточном варианте этот макрос расширяется до:
PyCriticalSection_End(&_py_cs); }
В стандартном варианте этот макрос расширяется до
}.Добавлен в версии 3.13.
-
Py_BEGIN_CRITICAL_SECTION2(a, b) -
Приобретает блокировки на уровне объектов для объектов a и b и начинает критическую секцию. Блокировки приобретаются в согласованном порядке (наименьший адрес в первую очередь), чтобы избежать тупиков из-за порядка блокировок.
В беспоточном варианте этот макрос расширяется до:
{ PyCriticalSection2 _py_cs2; PyCriticalSection2_Begin(&_py_cs2, (PyObject*)(a), (PyObject*)(b))В стандартном варианте этот макрос расширяется до
{.Добавлен в версии 3.13.
-
Py_END_CRITICAL_SECTION2() -
Заканчивает критическую секцию и освобождает блокировки на уровне объектов.
В беспоточном варианте этот макрос расширяется до:
PyCriticalSection2_End(&_py_cs2); }
В стандартном варианте этот макрос расширяется до
}.Добавлен в версии 3.13.
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/c-api/init.html