Initialisering, slutförande och trådar¶
Se Python Initialization Configuration för detaljer om hur man konfigurerar tolken före initialiseringen.
Före initialisering av Python¶
I ett program som innehåller Python måste funktionen Py_Initialize()
anropas innan några andra Python/C API-funktioner används, med undantag för några få funktioner och globala konfigurationsvariabler.
Följande funktioner kan anropas innan Python har initialiserats:
Funktioner som initierar tolken:
de förinitialiseringsfunktioner för körtid som omfattas av Konfiguration av Python-initialisering
Konfigurationsfunktioner:
PyInitFrozenExtensions()
konfigurationsfunktionerna som beskrivs i Konfiguration av Python-initialisering
Informativa funktioner:
Verktyg:
de statusrapporterings- och verktygsfunktioner som beskrivs i Konfiguration av Python-initialisering
Minnesallokatorer:
Synkronisering:
Anteckning
Trots deras uppenbara likhet med några av de funktioner som listas ovan, bör följande funktioner inte anropas innan tolken har initialiserats: Py_EncodeLocale()
, Py_GetPath()
, Py_GetPrefix()
, Py_GetExecPrefix()
, Py_GetProgramFullPath()
, Py_GetPythonHome()
, Py_GetProgramName()
, PyEval_InitThreads()
, och Py_RunMain()
.
Variabler för global konfiguration¶
Python har variabler för den globala konfigurationen för att styra olika funktioner och alternativ. Som standard styrs dessa flaggor av kommandoradsalternativ.
När en flagga anges av ett alternativ är flaggans värde det antal gånger som alternativet har angetts. Till exempel sätter -b
Py_BytesWarningFlag
till 1 och -bb
sätter Py_BytesWarningFlag
till 2.
-
int Py_BytesWarningFlag¶
Detta API behålls för bakåtkompatibilitet: inställningen
PyConfig.bytes_warning
bör användas istället, se Python Initialization Configuration.Utfärda en varning när du jämför
bytes
ellerbytearray
medstr
ellerbytes
medint
. Utfärda ett fel om det är större än eller lika med2
.Ställs in av alternativet
-b
.Deprecated since version 3.12, will be removed in version 3.15.
-
int Py_DebugFlag¶
Detta API behålls för bakåtkompatibilitet: inställningen
PyConfig.parser_debug
bör användas istället, se Python Initialization Configuration.Aktivera felsökningsutmatning för parser (endast för experter, beroende på kompileringsalternativ).
Ställs in av alternativet
-d
och miljövariabelnPYTHONDEBUG
.Deprecated since version 3.12, will be removed in version 3.15.
-
int Py_DontWriteBytecodeFlag¶
Detta API behålls för bakåtkompatibilitet: inställning
PyConfig.write_bytecode
bör användas istället, se Python Initialization Configuration.Om den är satt till icke-noll kommer Python inte att försöka skriva
.pyc
-filer vid import av källmoduler.Ställs in av alternativet
-B
och miljövariabelnPYTHONDONTWRITEBYTECODE
.Deprecated since version 3.12, will be removed in version 3.15.
-
int Py_FrozenFlag¶
Detta API behålls för bakåtkompatibilitet: inställningen
PyConfig.pathconfig_warnings
bör användas istället, se Python Initialization Configuration.Undertrycker felmeddelanden vid beräkning av modulens sökväg i
Py_GetPath()
.Privat flagga som används av programmen
_freeze_module
ochfrozenmain
.Deprecated since version 3.12, will be removed in version 3.15.
-
int Py_HashRandomizationFlag¶
Detta API behålls för bakåtkompatibilitet: inställningarna
PyConfig.hash_seed
ochPyConfig.use_hash_seed
bör användas istället, se Python Initialization Configuration.Sätts till
1
om miljövariabelnPYTHONHASHSEED
är satt till en icke-tom sträng.Om flaggan inte är noll, läs miljövariabeln
PYTHONHASHSEED
för att initiera det hemliga hashfröet.Deprecated since version 3.12, will be removed in version 3.15.
-
int Py_IgnoreEnvironmentFlag¶
Detta API behålls för bakåtkompatibilitet: inställningen
PyConfig.use_environment
bör användas istället, se Python Initialization Configuration.Ignorera alla
PYTHON*
miljövariabler, t.ex.PYTHONPATH
ochPYTHONHOME
, som kan vara inställda.Ställs in av alternativen
-E
och-I
.Deprecated since version 3.12, will be removed in version 3.15.
-
int Py_InspectFlag¶
Detta API behålls för bakåtkompatibilitet: inställningen
PyConfig.inspect
bör användas istället, se Python Initialization Configuration.När ett skript anges som första argument eller alternativet
-c
används, gå till interaktivt läge efter att skriptet eller kommandot har exekverats, även omsys.stdin
inte verkar vara en terminal.Ställs in av alternativet
-i
och miljövariabelnPYTHONINSPECT
.Deprecated since version 3.12, will be removed in version 3.15.
-
int Py_InteractiveFlag¶
Detta API behålls för bakåtkompatibilitet: inställning
PyConfig.interactive
bör användas istället, se Python Initialization Configuration.Ställs in av alternativet
-i
.Deprecated since version 3.12, will be removed in version 3.15.
-
int Py_IsolatedFlag¶
Detta API behålls för bakåtkompatibilitet: inställningen
PyConfig.isolated
bör användas istället, se Python Initialization Configuration.Kör Python i isolerat läge. I isolerat läge innehåller
sys.path
varken skriptets katalog eller användarens site-packages-katalog.Ställs in av alternativet
-I
.Tillagd i version 3.4.
Deprecated since version 3.12, will be removed in version 3.15.
-
int Py_LegacyWindowsFSEncodingFlag¶
Detta API behålls för bakåtkompatibilitet: inställningen
PyPreConfig.legacy_windows_fs_encoding
bör användas istället, se Python Initialization Configuration.Om flaggan är annan än noll, använd kodningen
mbcs
med felhanterarenreplace
istället för UTF-8-kodningen med felhanterarensurrogatepass
för filesystem encoding and error handler.Sätts till
1
om miljövariabelnPYTHONLEGACYWINDOWSFSENCODING
är satt till en icke-tom sträng.Se PEP 529 för mer information.
Tillgänglighet: Windows.
Deprecated since version 3.12, will be removed in version 3.15.
-
int Py_LegacyWindowsStdioFlag¶
Detta API behålls för bakåtkompatibilitet: inställning
PyConfig.legacy_windows_stdio
bör användas istället, se Python Initialization Configuration.Om flaggan inte är noll, använd
io.FileIO
istället förio._WindowsConsoleIO
försys
standardströmmar.Sätts till
1
om miljövariabelnPYTHONLEGACYWINDOWSSTDIO
är satt till en icke-tom sträng.Se PEP 528 för mer information.
Tillgänglighet: Windows.
Deprecated since version 3.12, will be removed in version 3.15.
-
int Py_NoSiteFlag¶
Detta API behålls för bakåtkompatibilitet: inställningen
PyConfig.site_import
bör användas istället, se Python Initialization Configuration.Inaktivera importen av modulen
site
och de platsberoende manipuleringarna avsys.path
som den medför. Inaktivera även dessa manipuleringar omsite
uttryckligen importeras senare (anropasite.main()
om du vill att de ska utlösas).Ställs in av alternativet
-S
.Deprecated since version 3.12, will be removed in version 3.15.
-
int Py_NoUserSiteDirectory¶
Detta API behålls för bakåtkompatibilitet: inställningen
PyConfig.user_site_directory
bör användas istället, se Python Initialization Configuration.Lägg inte till katalogen
user site-packages
isys.path
.Ställs in av alternativen
-s
och-I
samt miljövariabelnPYTHONNOUSERSITE
.Deprecated since version 3.12, will be removed in version 3.15.
-
int Py_OptimizeFlag¶
Detta API behålls för bakåtkompatibilitet: inställningen
PyConfig.optimization_level
bör användas istället, se Python Initialization Configuration.Ställs in av alternativet
-O
och miljövariabelnPYTHONOPTIMIZE
.Deprecated since version 3.12, will be removed in version 3.15.
-
int Py_QuietFlag¶
Detta API behålls för bakåtkompatibilitet: inställningen
PyConfig.quiet
bör användas istället, se Python Initialization Configuration.Visa inte copyright- och versionsmeddelanden ens i interaktivt läge.
Ställs in av alternativet
-q
.Tillagd i version 3.2.
Deprecated since version 3.12, will be removed in version 3.15.
-
int Py_UnbufferedStdioFlag¶
Detta API behålls för bakåtkompatibilitet: inställning
PyConfig.buffered_stdio
bör användas istället, se Python Initialization Configuration.Tvinga stdout- och stderr-strömmarna att vara obuffrade.
Ställs in av alternativet
-u
och miljövariabelnPYTHONUNBUFFERED
.Deprecated since version 3.12, will be removed in version 3.15.
-
int Py_VerboseFlag¶
Detta API behålls för bakåtkompatibilitet: inställningen
PyConfig.verbose
bör användas istället, se Python Initialization Configuration.Varje gång en modul initieras skrivs ett meddelande ut som visar varifrån den laddats (filnamn eller inbyggd modul). Om värdet är större än eller lika med
2
, skrivs ett meddelande ut för varje fil som kontrolleras vid sökning efter en modul. Ger också information om modulrensning vid avslutning.Ställs in av alternativet
-v
och miljövariabelnPYTHONVERBOSE
.Deprecated since version 3.12, will be removed in version 3.15.
Initialisering och slutbehandling av tolken¶
-
void Py_Initialize()¶
- En del av Stabil ABI.
Initialiserar Python-tolken. I ett program som bäddar in Python bör detta anropas innan du använder några andra Python/C API-funktioner; se För Python-initialisering för de få undantagen.
Detta initierar tabellen över inlästa moduler (
sys.modules
) och skapar de grundläggande modulernabuiltins
,__main__
ochsys
. Den initialiserar också sökvägen för modulerna (sys.path
). Den ställer inte insys.argv
; använd Python Initialization Configuration API för det. Detta är en no-op när den anropas en andra gång (utan att anropaPy_FinalizeEx()
först). Det finns inget returvärde; det är ett fatalt fel om initialiseringen misslyckas.Använd
Py_InitializeFromConfig()
för att anpassa Python Initialization Configuration.Anteckning
I Windows ändras konsolläget från
O_TEXT
tillO_BINARY
, vilket också påverkar konsolanvändning som inte är Python och som använder C Runtime.
-
void Py_InitializeEx(int initsigs)¶
- En del av Stabil ABI.
Denna funktion fungerar som
Py_Initialize()
om initsigs är1
. Om initsigs är0
hoppar den över initialiseringsregistreringen av signalhanterare, vilket kan vara användbart när CPython är inbäddat som en del av ett större program.Använd
Py_InitializeFromConfig()
för att anpassa Python Initialization Configuration.
-
PyStatus Py_InitializeFromConfig(const PyConfig *config)¶
Initiera Python från config-konfigurationen, enligt beskrivningen i Initialisering med PyConfig.
Se avsnittet Konfiguration av Python-initialisering för mer information om hur du förinitierar tolken, fyller i konfigurationsstrukturen för körtid och frågar efter den returnerade statusstrukturen.
-
int Py_IsInitialized()¶
- En del av Stabil ABI.
Returnerar true (icke-noll) när Python-tolken har initialiserats, false (noll) om så inte är fallet. Efter anrop av
Py_FinalizeEx()
returneras false tillsPy_Initialize()
anropas igen.
-
int Py_IsFinalizing()¶
- En del av Stabil ABI sedan version 3.13.
Returnerar true (icke-noll) om Pythons huvudtolk stänger ner. Returnerar false (noll) annars.
Tillagd i version 3.13.
-
int Py_FinalizeEx()¶
- En del av Stabil ABI sedan version 3.6.
Ångra alla initialiseringar som gjorts av
Py_Initialize()
och efterföljande användning av Python/C API-funktioner, och förstör alla undertolkare (sePy_NewInterpreter()
nedan) som skapats och ännu inte förstörts sedan det senaste anropet tillPy_Initialize()
. Detta är ett no-op när det anropas en andra gång (utan att först anropaPy_Initialize()
igen).Eftersom detta är det omvända av
Py_Initialize()
, bör det anropas i samma tråd med samma tolk aktiv. Det betyder huvudtråden och huvudtolken. Detta bör aldrig anropas medanPy_RunMain()
körs.Normalt är returvärdet
0
. Om det uppstod fel under slutförandet (rensning av buffrade data) returneras-1
.Observera att Python kommer att göra sitt bästa för att frigöra allt minne som allokerats av Python-tolken. Därför bör alla C-tillägg se till att korrekt städa upp alla tidigare allokerade PyObjects innan de används i efterföljande anrop till
Py_Initialize()
. Annars kan det introducera sårbarheter och felaktigt beteende.Denna funktion tillhandahålls av ett antal skäl. Ett inbäddningsprogram kanske vill starta om Python utan att behöva starta om programmet självt. En applikation som har laddat Python-tolken från ett dynamiskt laddningsbart bibliotek (eller DLL) kanske vill frigöra allt minne som allokerats av Python innan DLL:en avlastas. Under en jakt på minnesläckor i en applikation kan en utvecklare vilja frigöra allt minne som allokerats av Python innan applikationen avslutas.
Buggar och förbehåll: Destruktionen av moduler och objekt i moduler sker i slumpmässig ordning; detta kan leda till att destruktorer (
__del__()
metoder) misslyckas när de är beroende av andra objekt (även funktioner) eller moduler. Dynamiskt laddade tilläggsmoduler som laddats av Python avlastas inte. Små mängder minne som allokerats av Python-tolken kanske inte frigörs (om du hittar en läcka, rapportera den). Minne som är bundet i cirkulära referenser mellan objekt frigörs inte. Internerade strängar kommer alla att avallokeras oavsett deras referensantal. En del minne som allokeras av tilläggsmoduler kanske inte frigörs. Vissa tillägg kanske inte fungerar korrekt om deras initialiseringsrutin anropas mer än en gång; detta kan hända om ett program anroparPy_Initialize()
ochPy_FinalizeEx()
mer än en gång.Py_FinalizeEx()
får inte anropas rekursivt inifrån sig själv. Därför får den inte anropas av någon kod som kan köras som en del av tolkens avstängningsprocess, t.ex.atexit
-hanterare, objektavslutare eller någon kod som kan köras medan filerna stdout och stderr rensas.Utlöser en auditing event
cpython._PySys_ClearAuditHooks
utan argument.Tillagd i version 3.6.
-
void Py_Finalize()¶
- En del av Stabil ABI.
Detta är en bakåtkompatibel version av
Py_FinalizeEx()
som bortser från returvärdet.
-
int Py_BytesMain(int argc, char **argv)¶
- En del av Stabil ABI sedan version 3.8.
Liknar
Py_Main()
men argv är en array av bytessträngar, vilket gör att den anropande applikationen kan delegera textavkodningssteget till CPython-körtiden.Tillagd i version 3.8.
-
int Py_Main(int argc, wchar_t **argv)¶
- En del av Stabil ABI.
Huvudprogrammet för standardtolken, som innehåller en fullständig initialiserings-/avslutningscykel samt ytterligare beteende för att läsa konfigurationsinställningar från miljön och kommandoraden och sedan köra
__main__
i enlighet med Kommandorad.Detta görs tillgängligt för program som vill stödja hela CPythons kommandoradsgränssnitt, snarare än att bara bädda in en Python-körtid i en större applikation.
Parametrarna argc och argv liknar dem som skickas till ett C-programs funktion
main()
, förutom att argv-posterna först konverteras tillwchar_t
med hjälp avPy_DecodeLocale()
. Det är också viktigt att notera att posterna i argumentlistan kan ändras så att de pekar på andra strängar än de som skickas in (innehållet i de strängar som argumentlistan pekar på ändras dock inte).Returvärdet är
2
om argumentlistan inte representerar en giltig Python-kommandorad, och i övrigt samma somPy_RunMain()
.När det gäller CPython-runtime-konfigurations-API:er som dokumenteras i avsnittet runtime configuration (och utan hänsyn till felhantering) är
Py_Main
ungefär likvärdigt med:PyConfig config; PyConfig_InitPythonConfig(&config); PyConfig_SetArgv(&config, argc, argv); Py_InitializeFromConfig(&config); PyConfig_Clear(&config); Py_RunMain();
Vid normal användning kommer ett inbäddningsprogram att anropa den här funktionen i stället för att anropa
Py_Initialize()
,Py_InitializeEx()
ellerPy_InitializeFromConfig()
direkt, och alla inställningar kommer att tillämpas enligt beskrivningen på andra ställen i den här dokumentationen. Om denna funktion istället anropas efter ett föregående API-anrop för initiering av körtiden, är exakt vilka miljö- och kommandoradsinställningar som uppdateras versionsberoende (eftersom det beror på vilka inställningar som korrekt stöder att de ändras efter att de redan har ställts in en gång när körtiden initierades första gången).
-
int Py_RunMain(void)¶
Exekverar huvudmodulen i en fullt konfigurerad CPython-körtid.
Utför kommandot (
PyConfig.run_command
), skriptet (PyConfig.run_filename
) eller modulen (PyConfig.run_module
) som anges på kommandoraden eller i konfigurationen. Om inget av dessa värden har angetts körs den interaktiva Python-prompten (REPL) med hjälp av modulen__main__
globala namnrymd.Om
PyConfig.inspect
inte är inställd (standard), kommer returvärdet att vara0
om tolken avslutas normalt (dvs. utan att ett undantag uppstår), utgångsstatus för ett ohanteratSystemExit
, eller1
för något annat ohanterat undantag.Om
PyConfig.inspect
är inställt (t.ex. när alternativet-i
används), i stället för att återvända när tolken avslutas, kommer exekveringen i stället att återupptas i en interaktiv Python-prompt (REPL) som använder modulen__main__
’s globala namnrymd. Om tolken avslutades med ett undantag, tas det omedelbart upp i REPL-sessionen. Funktionens returvärde bestäms sedan av hur REPL-sessionen avslutas:0
,1
, eller statusen för enSystemExit
, enligt specifikationen ovan.Denna funktion slutför alltid Python-tolken innan den returneras.
Se Python Configuration för ett exempel på en anpassad Python som alltid körs i isolerat läge med
Py_RunMain()
.
-
int PyUnstable_AtExit(PyInterpreterState *interp, void (*func)(void*), void *data)¶
- Detta är Instabilt API. Den kan ändras utan förvarning i mindre versioner.
Registrera en
atexit
callback för måltolken interp. Detta liknarPy_AtExit()
, men tar en explicit tolk och datapekare för återuppringningen.Det måste finnas en attached thread state för interp.
Tillagd i version 3.13.
Processövergripande parametrar¶
-
void Py_SetProgramName(const wchar_t *name)¶
- En del av Stabil ABI.
Detta API behålls för bakåtkompatibilitet: inställningen
PyConfig.program_name
bör användas istället, se Python Initialization Configuration.Denna funktion bör anropas innan
Py_Initialize()
anropas för första gången, om den anropas överhuvudtaget. Den talar om för tolken värdet på argumentetargv[0]
till funktionenmain()
i programmet (konverterat till breda tecken). Detta används avPy_GetPath()
och några andra funktioner nedan för att hitta Pythons körtidsbibliotek i förhållande till tolkens körbara fil. Standardvärdet är'python'
. Argumentet ska peka på en nollavslutad bred teckensträng i statisk lagring vars innehåll inte kommer att ändras under programmets exekvering. Ingen kod i Python-tolken kommer att ändra innehållet i denna lagring.Använd
Py_DecodeLocale()
för att avkoda en bytes-sträng för att få en wchar_t*-sträng.Deprecated since version 3.11, will be removed in version 3.15.
-
wchar_t *Py_GetProgramName()¶
- En del av Stabil ABI.
Returnerar det programnamn som ställts in med
PyConfig.program_name
, eller standardvärdet. Den returnerade strängen pekar in i statisk lagring; anroparen bör inte ändra dess värde.Denna funktion bör inte anropas före
Py_Initialize()
, annars returnerar denNULL
.Ändrad i version 3.10: Den returnerar nu
NULL
om den anropas förePy_Initialize()
.Deprecated since version 3.13, will be removed in version 3.15: Använd
PyConfig_Get("executable")
(sys.executable
) istället.
-
wchar_t *Py_GetPrefix()¶
- En del av Stabil ABI.
Returnerar prefixet för installerade plattformsoberoende filer. Detta härleds genom ett antal komplicerade regler från det programnamn som anges med
PyConfig.program_name
och vissa miljövariabler; till exempel, om programnamnet är'/usr/local/bin/python'
, är prefixet'/usr/local'
. Den returnerade strängen pekar in i statisk lagring; anroparen ska inte ändra dess värde. Detta motsvarar variabeln prefix i toppnivånMakefile
och argumentet--prefix
till skriptet configure vid byggtiden. Värdet är tillgängligt för Python-kod somsys.base_prefix
. Det är endast användbart på Unix. Se även nästa funktion.Denna funktion bör inte anropas före
Py_Initialize()
, annars returnerar denNULL
.Ändrad i version 3.10: Den returnerar nu
NULL
om den anropas förePy_Initialize()
.Deprecated since version 3.13, will be removed in version 3.15: Använd
PyConfig_Get("base_prefix")
(sys.base_prefix
) istället. AnvändPyConfig_Get("prefix")
(sys.prefix
) om virtuella miljöer behöver hanteras.
-
wchar_t *Py_GetExecPrefix()¶
- En del av Stabil ABI.
Returnerar exec-prefixet för installerade plattformsberoende* filer. Detta härleds genom ett antal komplicerade regler från det programnamn som anges med
PyConfig.program_name
och vissa miljövariabler; till exempel, om programnamnet är'/usr/local/bin/python'
, är exec-prefixet'/usr/local'
. Den returnerade strängen pekar in i statisk lagring; anroparen ska inte ändra dess värde. Detta motsvarar variabeln exec_prefix i toppnivånMakefile
och argumentet--exec-prefix
till skriptet configure vid byggtiden. Värdet är tillgängligt för Python-kod somsys.base_exec_prefix
. Det är endast användbart på Unix.Bakgrund: Exec-prefixet skiljer sig från prefixet när plattformsberoende filer (t.ex. körbara filer och delade bibliotek) installeras i ett annat katalogträd. I en typisk installation kan plattformsberoende filer installeras i underträdet
/usr/local/plat
medan plattformsoberoende kan installeras i/usr/local
.Generellt sett är en plattform en kombination av maskinvaru- och programvarufamiljer, t.ex. Sparc-maskiner som kör operativsystemet Solaris 2.x betraktas som samma plattform, men Intel-maskiner som kör Solaris 2.x är en annan plattform och Intel-maskiner som kör Linux är ytterligare en annan plattform. Olika större revisioner av samma operativsystem utgör i allmänhet också olika plattformar. Icke-Unix-operativsystem är en annan historia; installationsstrategierna på dessa system är så olika att prefixet och exec-prefixet är meningslösa och sätts till den tomma strängen. Observera att kompilerade Python-bytekodfiler är plattformsoberoende (men inte oberoende av den Python-version som de kompilerades med!)
Systemadministratörer kommer att veta hur man konfigurerar programmen mount eller automount för att dela
/usr/local
mellan plattformar samtidigt som/usr/local/plat
är ett annat filsystem för varje plattform.Denna funktion bör inte anropas före
Py_Initialize()
, annars returnerar denNULL
.Ändrad i version 3.10: Den returnerar nu
NULL
om den anropas förePy_Initialize()
.Deprecated since version 3.13, will be removed in version 3.15: Använd
PyConfig_Get("base_exec_prefix")
(sys.base_exec_prefix
) istället. AnvändPyConfig_Get("exec_prefix")
(sys.exec_prefix
) om virtuella miljöer behöver hanteras.
-
wchar_t *Py_GetProgramFullPath()¶
- En del av Stabil ABI.
Returnerar det fullständiga programnamnet för den körbara Python-filen; detta beräknas som en bieffekt av att standardmodulsökvägen härleds från programnamnet (anges av
PyConfig.program_name
). Den returnerade strängen pekar in i statisk lagring; anroparen bör inte ändra dess värde. Värdet är tillgängligt för Python-kod somsys.executable
.Denna funktion bör inte anropas före
Py_Initialize()
, annars returnerar denNULL
.Ändrad i version 3.10: Den returnerar nu
NULL
om den anropas förePy_Initialize()
.Deprecated since version 3.13, will be removed in version 3.15: Använd
PyConfig_Get("executable")
(sys.executable
) istället.
-
wchar_t *Py_GetPath()¶
- En del av Stabil ABI.
Returnerar standardmodulsökvägen; denna beräknas från programnamnet (anges av
PyConfig.program_name
) och vissa miljövariabler. Den returnerade strängen består av en serie katalognamn åtskilda av ett plattformsberoende avgränsningstecken. Avgränsningstecknet är':'
på Unix och macOS,';'
på Windows. Den returnerade strängen pekar in i statisk lagring; anroparen bör inte ändra dess värde. Listansys.path
initialiseras med detta värde när tolken startas; den kan (och brukar) modifieras senare för att ändra sökvägen för laddning av moduler.Denna funktion bör inte anropas före
Py_Initialize()
, annars returnerar denNULL
.Ändrad i version 3.10: Den returnerar nu
NULL
om den anropas förePy_Initialize()
.Deprecated since version 3.13, will be removed in version 3.15: Använd
PyConfig_Get("module_search_paths")
(sys.path
) istället.
-
const char *Py_GetVersion()¶
- En del av Stabil ABI.
Returnerar versionen av denna Python-tolk. Detta är en sträng som ser ut ungefär som
"3.0a5+ (py3k:63103M, 12 maj 2008, 00:53:55) \n[GCC 4.2.3]"
Det första ordet (upp till det första mellanslagstecknet) är den aktuella Python-versionen; de första tecknen är major- och minor-versionen åtskilda av en punkt. Den returnerade strängen pekar in i statisk lagring; anroparen bör inte ändra dess värde. Värdet är tillgängligt för Python-kod som
sys.version
.Se även konstanten
Py_Version
.
-
const char *Py_GetPlatform()¶
- En del av Stabil ABI.
Returnerar plattformsidentifieraren för den aktuella plattformen. På Unix bildas detta av operativsystemets ”officiella” namn, konverterat till gemener, följt av det större revisionsnumret; t.ex. för Solaris 2.x, som också är känt som SunOS 5.x, är värdet
'sunos5'
. På macOS är det'darwin'
. På Windows är det'win'
. Den returnerade strängen pekar in i statisk lagring; anroparen ska inte ändra dess värde. Värdet är tillgängligt för Python-kod somsys.platform
.
-
const char *Py_GetCopyright()¶
- En del av Stabil ABI.
Returnera den officiella copyright-strängen för den aktuella Python-versionen, till exempel
'Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam'
Den returnerade strängen pekar in i statisk lagring; anroparen ska inte ändra dess värde. Värdet är tillgängligt för Python-kod som
sys.copyright
.
-
const char *Py_GetCompiler()¶
- En del av Stabil ABI.
Returnera en indikation på kompilatorn som användes för att bygga den aktuella Python-versionen, inom hakparenteser, till exempel:
"[GCC 2.7.2.2]"
Den returnerade strängen pekar in i statisk lagring; anroparen ska inte ändra dess värde. Värdet är tillgängligt för Python-kod som en del av variabeln
sys.version
.
-
const char *Py_GetBuildInfo()¶
- En del av Stabil ABI.
Returnera information om sekvensnummer och byggdatum och -tid för den aktuella Python-tolkinstansen, till exempel
"#67, 1 Aug 1997, 22:34:28"
Den returnerade strängen pekar in i statisk lagring; anroparen ska inte ändra dess värde. Värdet är tillgängligt för Python-kod som en del av variabeln
sys.version
.
-
void PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath)¶
- En del av Stabil ABI.
Detta API behålls för bakåtkompatibilitet: inställningarna
PyConfig.argv
,PyConfig.parse_argv
ochPyConfig.safe_path
bör användas istället, se Python Initialization Configuration.Ställ in
sys.argv
baserat på argc och argv. Dessa parametrar liknar de som skickas till programmets funktionmain()
med skillnaden att den första posten ska referera till skriptfilen som ska köras istället för den körbara filen som är värd för Python-tolken. Om det inte finns något skript som ska köras kan den första posten i argv vara en tom sträng. Om denna funktion misslyckas med att initierasys.argv
, signaleras ett fatalt tillstånd medPy_FatalError()
.Om updatepath är noll är detta allt som funktionen gör. Om updatepath inte är noll, ändrar funktionen även
sys.path
enligt följande algoritm:Om namnet på ett befintligt skript anges i
argv[0]
, läggs den absoluta sökvägen till den katalog där skriptet finns tillsys.path
.I annat fall (dvs. om argc är
0
ellerargv[0]
inte pekar på ett befintligt filnamn) läggs en tom sträng till isys.path
, vilket är samma sak som att lägga till den aktuella arbetskatalogen ("."
).
Använd
Py_DecodeLocale()
för att avkoda en bytes-sträng för att få en wchar_t*-sträng.Se även
PyConfig.orig_argv
ochPyConfig.argv
i Python Initialization Configuration.Anteckning
Det rekommenderas att program som bäddar in Python-tolken för andra ändamål än att exekvera ett enda skript skickar
0
som updatepath, och uppdaterarsys.path
själva om så önskas. Se CVE 2008-5983.På versioner före 3.1.3 kan du uppnå samma effekt genom att manuellt poppa det första
sys.path
-elementet efter att ha anropatPySys_SetArgv()
, till exempel med:PyRun_SimpleString("import sys; sys.path.pop(0)\n");
Tillagd i version 3.1.3.
Deprecated since version 3.11, will be removed in version 3.15.
-
void PySys_SetArgv(int argc, wchar_t **argv)¶
- En del av Stabil ABI.
Detta API behålls för bakåtkompatibilitet: inställningarna
PyConfig.argv
ochPyConfig.parse_argv
bör användas istället, se Python Initialization Configuration.Den här funktionen fungerar som
PySys_SetArgvEx()
med updatepath satt till1
om inte tolken python startades med-I
.Använd
Py_DecodeLocale()
för att avkoda en bytes-sträng för att få en wchar_t*-sträng.Se även
PyConfig.orig_argv
ochPyConfig.argv
i Python Initialization Configuration.Ändrad i version 3.4: Värdet updatepath beror på
-I
.Deprecated since version 3.11, will be removed in version 3.15.
-
void Py_SetPythonHome(const wchar_t *home)¶
- En del av Stabil ABI.
Detta API behålls för bakåtkompatibilitet: inställningen
PyConfig.home
bör användas istället, se Python Initialization Configuration.Ställ in standardkatalogen ”home”, det vill säga platsen för Pythons standardbibliotek. Se
PYTHONHOME
för innebörden av argumentsträngen.Argumentet ska peka på en nollavslutad teckensträng i statisk lagring vars innehåll inte kommer att ändras under programmets exekvering. Ingen kod i Python-tolken kommer att ändra innehållet i detta lager.
Använd
Py_DecodeLocale()
för att avkoda en bytes-sträng för att få en wchar_t*-sträng.Deprecated since version 3.11, will be removed in version 3.15.
-
wchar_t *Py_GetPythonHome()¶
- En del av Stabil ABI.
Returnerar standard ”home”, det vill säga det värde som anges av
PyConfig.home
, eller värdet på miljövariabelnPYTHONHOME
om den är angiven.Denna funktion bör inte anropas före
Py_Initialize()
, annars returnerar denNULL
.Ändrad i version 3.10: Den returnerar nu
NULL
om den anropas förePy_Initialize()
.Deprecated since version 3.13, will be removed in version 3.15: Använd
PyConfig_Get("home")
eller miljövariabelnPYTHONHOME
istället.
Thread State och det globala tolkningslåset¶
Om inte på en free-threaded-byggnad av CPython, är Python-tolken inte helt trådsäker. För att stödja flertrådade Python-program finns det ett globalt lås, kallat global interpreter lock eller GIL, som måste hållas av den aktuella tråden innan den kan komma åt Python-objekt på ett säkert sätt. Utan låset kan även de enklaste operationer orsaka problem i ett flertrådigt program: till exempel, när två trådar samtidigt ökar referensantalet för samma objekt, kan det sluta med att referensantalet bara ökas en gång istället för två gånger.
Därför finns regeln att endast den tråd som har förvärvat GIL kan operera på Python-objekt eller anropa Python/C API-funktioner. För att emulera samtidig exekvering försöker tolken regelbundet att byta tråd (se sys.setswitchinterval()
). Låset släpps också runt potentiellt blockerande I/O-operationer som att läsa eller skriva en fil, så att andra Python-trådar kan köras under tiden.
Python-tolken håller viss trådspecifik bokföringsinformation i en datastruktur som heter PyThreadState
, känd som en thread state. Varje OS-tråd har en trådlokal pekare till en PyThreadState
; ett trådtillstånd som refereras av denna pekare anses vara attached.
En tråd kan bara ha en attached thread state åt gången. Ett bifogat trådtillstånd är typiskt analogt med att hålla GIL, förutom på free-threaded builds. På byggen med GIL aktiverat, kommer attaching ett trådtillstånd att blockera tills GIL kan förvärvas. Men även på byggen med GIL inaktiverat krävs det fortfarande att man har ett anslutet trådtillstånd för att anropa det mesta av C API.
I allmänhet kommer det alltid att finnas en attached thread state när man använder Pythons C API. Endast i vissa specifika fall (t.ex. i ett Py_BEGIN_ALLOW_THREADS
-block) kommer tråden inte att ha ett attached thread state. Om du är osäker, kontrollera om PyThreadState_GetUnchecked()
returnerar NULL
.
Avlägsna trådtillståndet från tilläggskoden¶
Den mesta tilläggskoden som manipulerar thread state har följande enkla struktur:
Spara trådtillståndet i en lokal variabel.
... Utför någon blockerande I/O-operation ...
Återställ trådtillståndet från den lokala variabeln.
Detta är så vanligt att det finns ett par makron för att förenkla det:
Py_BEGIN_ALLOW_THREADS
... Gör någon blockerande I/O-operation ...
Py_END_ALLOW_THREADS
Makrot Py_BEGIN_ALLOW_THREADS
öppnar ett nytt block och deklarerar en dold lokal variabel; makrot Py_END_ALLOW_THREADS
stänger blocket.
Blocket ovan expanderar till följande kod:
PyThreadState *_save;
_save = PyEval_SaveThread();
... Gör någon blockerande I/O-operation ...
PyEval_RestoreThread(_save);
Så här fungerar dessa funktioner:
Den attached thread state håller GIL för hela tolken. När man tar bort attached thread state släpps GIL, vilket gör det möjligt för andra trådar att koppla ett thread state till sin egen tråd, som därmed får GIL och kan börja exekvera. Pekaren till den tidigare attached thread state lagras som en lokal variabel. När man når Py_END_ALLOW_THREADS
, skickas trådtillståndet som tidigare var attached till PyEval_RestoreThread()
. Denna funktion kommer att blockera tills en annan släpper sin thread state, vilket gör att den gamla thread state kan återanslutas och C API kan anropas igen.
För free-threaded-kompileringar är GIL normalt inte aktuellt, men det är fortfarande nödvändigt att koppla bort thread state för att blockera I/O och långa operationer. Skillnaden är att trådar inte behöver vänta på att GIL frigörs för att koppla sin trådstatus, vilket möjliggör äkta parallellitet med flera kärnor.
Anteckning
Anrop av systemets I/O-funktioner är det vanligaste användningsområdet för att koppla bort thread state, men det kan också vara användbart innan man anropar långvariga beräkningar som inte behöver tillgång till Python-objekt, till exempel komprimerings- eller kryptografiska funktioner som arbetar över minnesbuffertar. Standardmodulerna zlib
och hashlib
avaktiverar till exempel thread state när de komprimerar eller hashar data.
Icke-Python skapade trådar¶
När trådar skapas med hjälp av Pythons särskilda API:er (t.ex. modulen threading
) associeras de automatiskt med ett trådtillstånd och koden ovan är därför korrekt. Men när trådar skapas från C (t.ex. av ett tredjepartsbibliotek med egen trådhantering) har de inte GIL, eftersom de inte har någon attached thread state.
Om du behöver anropa Python-kod från dessa trådar (ofta kommer detta att vara en del av ett callback-API som tillhandahålls av det tidigare nämnda tredjepartsbiblioteket), måste du först registrera dessa trådar med tolken genom att skapa en attached thread state innan du kan börja använda Python/C API. När du är klar bör du ta bort thread state och slutligen frigöra det.
Funktionerna PyGILState_Ensure()
och PyGILState_Release()
gör allt detta automatiskt. Det typiska idiomet för att anropa till Python från en C-tråd är:
PyGILState_STATE gstate;
gstate = PyGILState_Ensure();
/* Utför Python-åtgärder här. */
resultat = CallSomeFunction();
/* utvärdera resultat eller hantera undantag */
/* Släpp tråden. Inget Python API tillåts bortom denna punkt. */
PyGILState_Release(gstate);
Observera att funktionerna PyGILState_*
förutsätter att det bara finns en global tolk (som skapas automatiskt av Py_Initialize()
). Python stöder skapandet av ytterligare tolkar (med Py_NewInterpreter()
), men att blanda flera tolkar och API:et PyGILState_*
stöds inte. Detta beror på att PyGILState_Ensure()
och liknande funktioner som standard attaching ett thread state för huvudtolken, vilket innebär att tråden inte säkert kan interagera med den anropande undertolken.
Stöd för undertolkar i icke-Python-trådar¶
Om du vill stödja undertolkar med trådar som inte skapats av Python måste du använda API:et PyThreadState_*
istället för det traditionella API:et PyGILState_*
.
I synnerhet måste du lagra tolktillståndet från den anropande funktionen och skicka det till PyThreadState_New()
, som kommer att säkerställa att thread state riktar sig till rätt tolk:
/* Returvärdet av PyInterpreterState_Get() från funktionen som
funktion som skapade den här tråden. */
PyInterpreterState *interp = ThreadData->interp;
PyThreadState *tstate = PyThreadState_New(interp);
PyThreadState_Swap(tstate);
/* Undertolkarens GIL hålls nu.
Utför Python-åtgärder här. */
resultat = CallSomeFunction();
/* utvärdera resultat eller hantera undantag */
/* Förstör trådtillståndet. Inget Python API tillåts bortom denna punkt. */
PyThreadState_Clear(tstate);
PyThreadState_DeleteCurrent();
Försiktighetsåtgärder för fork()¶
En annan viktig sak att notera om trådar är deras beteende inför C fork()
-anropet. På de flesta system med fork()
kommer det efter att en process har gafflats bara att finnas den tråd som utfärdade gafflingen. Detta har en konkret inverkan både på hur lås måste hanteras och på allt lagrat tillstånd i CPythons körtid.
Det faktum att endast den ”aktuella” tråden finns kvar innebär att eventuella lås som innehas av andra trådar aldrig kommer att släppas. Python löser detta för os.fork()
genom att förvärva de lås som den använder internt före förgreningen och släppa dem efteråt. Dessutom återställs alla Lås objekt i barnet. När Python utökas eller bäddas in finns det inget sätt att informera Python om ytterligare (icke-Python) lås som behöver förvärvas före eller återställas efter en fork. OS-faciliteter som pthread_atfork()
skulle behöva användas för att åstadkomma samma sak. Dessutom, när Python utökas eller bäddas in, kan anrop av fork()
direkt istället för genom os.fork()
(och återgå till eller anropa Python) resultera i ett dödläge genom att ett av Pythons interna lås hålls av en tråd som inte längre finns efter förgreningen. PyOS_AfterFork_Child()
försöker återställa de nödvändiga låsen, men kan inte alltid göra det.
Det faktum att alla andra trådar försvinner innebär också att CPythons runtime state där måste rensas upp ordentligt, vilket os.fork()
gör. Detta innebär att alla andra PyThreadState
-objekt som tillhör den aktuella tolken och alla andra PyInterpreterState
-objekt måste slutföras. På grund av detta och den speciella karaktären hos ”main”-tolken, bör fork()
endast anropas i den tolkens ”main”-tråd, där CPythons globala runtime ursprungligen initialiserades. Det enda undantaget är om exec()
kommer att anropas omedelbart efter.
Försiktighetsåtgärder avseende runtime-finalisering¶
I det sena skedet av interpreter shutdown, efter att ha försökt vänta på att icke-daemon-trådar ska avslutas (även om detta kan avbrytas av KeyboardInterrupt
) och efter att ha kört atexit
-funktionerna, markeras körtiden som finalizing: Py_IsFinalizing()
och sys.is_finalizing()
returnerar true. Vid denna tidpunkt är det bara den finaliseringstråd som initierade finaliseringen (vanligtvis huvudtråden) som får förvärva GIL.
Om någon tråd, annan än den avslutande tråden, försöker lägga till en thread state under avslutningen, antingen explicit eller implicit, går tråden in i ett permanent blockerat tillstånd där den förblir tills programmet avslutas. I de flesta fall är detta ofarligt, men det kan leda till dödläge om ett senare steg i slutförandet försöker förvärva ett lås som ägs av den blockerade tråden, eller på annat sätt väntar på den blockerade tråden.
Brutto? Ja, det är det. Detta förhindrar slumpmässiga krascher och / eller oväntat hoppade över C ++ -avslutningar längre upp i samtalsstacken när sådana trådar tvångsavslutades här i CPython 3.13 och tidigare. CPythons körtid thread state C API:er har aldrig haft några förväntningar på felrapportering eller hantering vid thread state attachment-tid som skulle ha möjliggjort en graciös utgång från denna situation. Att ändra det skulle kräva nya stabila C API: er och skriva om majoriteten av C-koden i CPython-ekosystemet för att använda dem med felhantering.
API på hög nivå¶
Dessa är de vanligaste typerna och funktionerna när du skriver C-tilläggskod eller när du bäddar in Python-tolken:
-
type PyInterpreterState¶
- En del av Begränsat API (som en ogenomskinlig struktur).
Denna datastruktur representerar det tillstånd som delas av ett antal samarbetande trådar. Trådar som tillhör samma tolk delar sin moduladministration och några andra interna objekt. Det finns inga offentliga medlemmar i denna struktur.
Trådar som tillhör olika tolkar delar till en början ingenting, förutom processstatus som tillgängligt minne, öppna filbeskrivare och liknande. Det globala tolklåset delas också av alla trådar, oavsett vilken tolk de tillhör.
-
type PyThreadState¶
- En del av Begränsat API (som en ogenomskinlig struktur).
Denna datastruktur representerar tillståndet för en enskild tråd. Den enda offentliga datamedlemmen är:
-
PyInterpreterState *interp¶
Den här trådens tolkstatus.
-
PyInterpreterState *interp¶
-
void PyEval_InitThreads()¶
- En del av Stabil ABI.
Föråldrad funktion som inte gör någonting.
I Python 3.6 och äldre skapade den här funktionen GIL om den inte fanns.
Ändrad i version 3.9: Funktionen gör nu ingenting.
Ändrad i version 3.7: Den här funktionen anropas nu av
Py_Initialize()
, så du behöver inte anropa den själv längre.Ändrad i version 3.2: Den här funktionen kan inte längre anropas före
Py_Initialize()
.Föråldrad sedan version 3.9.
-
PyThreadState *PyEval_SaveThread()¶
- En del av Stabil ABI.
Avlägsna attached thread state och returnera det. Tråden kommer inte att ha någon thread state när den återlämnas.
-
void PyEval_RestoreThread(PyThreadState *tstate)¶
- En del av Stabil ABI.
Sätt attached thread state till tstate. Det passerade thread state bör inte vara attached, annars uppstår deadlock. tstate kommer att vara attached vid returnering.
Anteckning
Om du anropar den här funktionen från en tråd när körtiden håller på att slutföras kommer tråden att hänga kvar tills programmet avslutas, även om tråden inte skapades av Python. Se Försiktighetsåtgärder avseende runtime-finalisering för mer information.
Ändrad i version 3.14: Hänger den aktuella tråden i stället för att avsluta den, om den anropas medan tolken håller på att slutföras.
-
PyThreadState *PyThreadState_Get()¶
- En del av Stabil ABI.
Returnerar attached thread state. Om tråden inte har något anslutet trådtillstånd (t.ex. inuti ett
Py_BEGIN_ALLOW_THREADS
block), så ger detta ett fatalt fel (så att anroparen inte behöver kontrollera förNULL
).Se även
PyThreadState_GetUnchecked()
.
-
PyThreadState *PyThreadState_GetUnchecked()¶
Liknar
PyThreadState_Get()
, men dödar inte processen med ett fatalt fel om det är NULL. Den som anropar är ansvarig för att kontrollera om resultatet är NULL.Tillagd i version 3.13: I Python 3.5 till 3.12 var funktionen privat och känd som
_PyThreadState_UncheckedGet()
.
-
PyThreadState *PyThreadState_Swap(PyThreadState *tstate)¶
- En del av Stabil ABI.
Sätter attached thread state till tstate, och returnerar thread state som var attached innan anropet.
Denna funktion är säker att anropa utan en attached thread state; den kommer helt enkelt att returnera
NULL
vilket indikerar att det inte fanns någon tidigare thread state.Anteckning
I likhet med
PyGILState_Ensure()
, kommer denna funktion att hänga upp tråden om runtime håller på att slutföras.
Följande funktioner använder trådlokal lagring och är inte kompatibla med undertolkare:
-
PyGILState_STATE PyGILState_Ensure()¶
- En del av Stabil ABI.
Säkerställer att den aktuella tråden är redo att anropa Python C API oavsett Pythons aktuella status eller attached thread state. Detta kan anropas hur många gånger som helst av en tråd så länge som varje anrop matchas med ett anrop till
PyGILState_Release()
. I allmänhet kan andra trådrelaterade API:er användas mellan anropen avPyGILState_Ensure()
ochPyGILState_Release()
så länge som trådens tillstånd återställs till dess tidigare tillstånd före Release(). Till exempel är normal användning av makronaPy_BEGIN_ALLOW_THREADS
ochPy_END_ALLOW_THREADS
acceptabel.Returvärdet är ett opakt ”handtag” till attached thread state när
PyGILState_Ensure()
anropades, och måste skickas tillPyGILState_Release()
för att säkerställa att Python lämnas i samma tillstånd. Även om rekursiva anrop är tillåtna, kan dessa handtag inte delas - varje unikt anrop tillPyGILState_Ensure()
måste spara handtaget för sitt anrop tillPyGILState_Release()
.När funktionen returneras kommer det att finnas en attached thread state och tråden kommer att kunna anropa godtycklig Python-kod. Misslyckande är ett fatalt fel.
Varning
Det är osäkert att anropa denna funktion när runtime håller på att avslutas. Om du gör det kommer du antingen att hänga upp tråden tills programmet avslutas, eller i sällsynta fall krascha tolken helt och hållet. Se Försiktighetsåtgärder avseende runtime-finalisering för mer information.
Ändrad i version 3.14: Hänger den aktuella tråden i stället för att avsluta den, om den anropas medan tolken håller på att slutföras.
-
void PyGILState_Release(PyGILState_STATE)¶
- En del av Stabil ABI.
Frigör alla resurser som tidigare förvärvats. Efter detta anrop kommer Pythons tillstånd att vara detsamma som det var före motsvarande
PyGILState_Ensure()
-anrop (men i allmänhet kommer detta tillstånd att vara okänt för anroparen, därav användningen av GILState API).Varje anrop till
PyGILState_Ensure()
måste motsvaras av ett anrop tillPyGILState_Release()
på samma tråd.
-
PyThreadState *PyGILState_GetThisThreadState()¶
- En del av Stabil ABI.
Hämta attached thread state för den här tråden. Kan returnera
NULL
om inget GILState API har använts på den aktuella tråden. Observera att huvudtråden alltid har ett sådant trådtillstånd, även om inget anrop om automatiskt trådtillstånd har gjorts på huvudtråden. Detta är huvudsakligen en hjälp/diagnostisk funktion.Anteckning
Den här funktionen tar inte hänsyn till thread states som skapats av något annat än
PyGILState_Ensure()
(t.ex.PyThreadState_New()
). FöredrarPyThreadState_Get()
ellerPyThreadState_GetUnchecked()
för de flesta fall.
-
int PyGILState_Check()¶
Returnerar
1
om den aktuella tråden håller i GIL och0
annars. Denna funktion kan anropas från vilken tråd som helst när som helst. Endast om den har fått sin thread state initialiserad viaPyGILState_Ensure()
kommer den att returnera1
. Detta är huvudsakligen en hjälp/diagnostisk funktion. Den kan vara användbar till exempel i återuppringningssammanhang eller minnesallokeringsfunktioner när vetskapen om att GIL är låst kan göra det möjligt för anroparen att utföra känsliga åtgärder eller på annat sätt bete sig annorlunda.Anteckning
Om den aktuella Python-processen någonsin har skapat en undertolk, kommer denna funktion alltid att returnera
1
. FöredrarPyThreadState_GetUnchecked()
för de flesta fall.Tillagd i version 3.4.
Följande makron används normalt utan efterföljande semikolon; se exempel på hur de används i Pythons källdistribution.
-
Py_BEGIN_ALLOW_THREADS¶
- En del av Stabil ABI.
Detta makro expanderar till
{ PyThreadState *_save; _save = PyEval_SaveThread();
. Observera att det innehåller en inledande parentes; det måste matchas med ett följandePy_END_ALLOW_THREADS
-makro. Se ovan för vidare diskussion om detta makro.
-
Py_END_ALLOW_THREADS¶
- En del av Stabil ABI.
Detta makro expanderar till
PyEval_RestoreThread(_save); }
. Observera att det innehåller en avslutande parentes; det måste matchas med ett tidigarePy_BEGIN_ALLOW_THREADS
-makro. Se ovan för ytterligare diskussion om detta makro.
-
Py_BLOCK_THREADS¶
- En del av Stabil ABI.
Detta makro expanderar till
PyEval_RestoreThread(_save);
: det är likvärdigt medPy_END_ALLOW_THREADS
utan den avslutande parentesen.
-
Py_UNBLOCK_THREADS¶
- En del av Stabil ABI.
Detta makro expanderar till
_save = PyEval_SaveThread();
: det motsvararPy_BEGIN_ALLOW_THREADS
utan inledande hängslen och variabeldeklaration.
API på låg nivå¶
Alla följande funktioner måste anropas efter Py_Initialize()
.
Ändrad i version 3.7: Py_Initialize()
initierar nu GIL och sätter en attached thread state.
-
PyInterpreterState *PyInterpreterState_New()¶
- En del av Stabil ABI.
Skapar ett nytt tolktillståndsobjekt. En attached thread state behövs inte, men kan eventuellt existera om det är nödvändigt att serialisera anrop till denna funktion.
Utlöser en auditing event
cpython.PyInterpreterState_New
utan argument.
-
void PyInterpreterState_Clear(PyInterpreterState *interp)¶
- En del av Stabil ABI.
Återställer all information i ett tolkstatusobjekt. Det måste finnas en attached thread state för tolken.
Utlöser en auditing event
cpython.PyInterpreterState_Clear
utan argument.
-
void PyInterpreterState_Delete(PyInterpreterState *interp)¶
- En del av Stabil ABI.
Förstör ett tolktillståndsobjekt. Det bör inte finnas något attached thread state för måltolken. Tolkens tillstånd måste ha återställts med ett tidigare anrop till
PyInterpreterState_Clear()
.
-
PyThreadState *PyThreadState_New(PyInterpreterState *interp)¶
- En del av Stabil ABI.
Skapar ett nytt trådtillståndsobjekt som hör till det givna tolkobjektet. En attached thread state behövs inte.
-
void PyThreadState_Clear(PyThreadState *tstate)¶
- En del av Stabil ABI.
Återställer all information i ett thread state-objekt. tstate måste vara attached
Ändrad i version 3.9: Denna funktion anropar nu
PyThreadState.on_delete
callback. Tidigare skedde det iPyThreadState_Delete()
.Ändrad i version 3.13: Återkallelsen
PyThreadState.on_delete
togs bort.
-
void PyThreadState_Delete(PyThreadState *tstate)¶
- En del av Stabil ABI.
Förstör ett thread state-objekt. tstate bör inte vara attached till någon tråd. tstate måste ha återställts med ett tidigare anrop till
PyThreadState_Clear()
.
-
void PyThreadState_DeleteCurrent(void)¶
Avlägsna attached thread state (som måste ha återställts med ett tidigare anrop till
PyThreadState_Clear()
) och förstör det sedan.Ingen thread state kommer att vara attached vid returnering.
-
PyFrameObject *PyThreadState_GetFrame(PyThreadState *tstate)¶
- En del av Stabil ABI sedan version 3.10.
Hämta den aktuella bilden av Python-trådtillståndet tstate.
Returnerar en strong reference. Returnerar
NULL
om ingen ram körs för närvarande.Se även
PyEval_GetFrame()
.tstate får inte vara
NULL
, och måste vara attached.Tillagd i version 3.9.
-
uint64_t PyThreadState_GetID(PyThreadState *tstate)¶
- En del av Stabil ABI sedan version 3.10.
Hämta den unika thread state-identifieraren för Python-trådtillståndet tstate.
tstate får inte vara
NULL
, och måste vara attached.Tillagd i version 3.9.
-
PyInterpreterState *PyThreadState_GetInterpreter(PyThreadState *tstate)¶
- En del av Stabil ABI sedan version 3.10.
Hämta tolken för Python-trådtillståndet tstate.
tstate får inte vara
NULL
, och måste vara attached.Tillagd i version 3.9.
-
void PyThreadState_EnterTracing(PyThreadState *tstate)¶
Avbryt spårning och profilering i Python-trådtillståndet tstate.
Återuppta dem med hjälp av funktionen
PyThreadState_LeaveTracing()
.Tillagd i version 3.11.
-
void PyThreadState_LeaveTracing(PyThreadState *tstate)¶
Återuppta spårning och profilering i Python-trådtillståndet tstate som avbröts av funktionen
PyThreadState_EnterTracing()
.Se även funktionerna
PyEval_SetTrace()
ochPyEval_SetProfile()
.Tillagd i version 3.11.
-
PyInterpreterState *PyInterpreterState_Get(void)¶
- En del av Stabil ABI sedan version 3.9.
Hämta den aktuella tolken.
Utfärdar ett allvarligt fel om det inte finns någon attached thread state. Den kan inte returnera NULL.
Tillagd i version 3.9.
-
int64_t PyInterpreterState_GetID(PyInterpreterState *interp)¶
- En del av Stabil ABI sedan version 3.7.
Returnerar tolkens unika ID. Om något fel inträffade returneras
-1
och ett fel anges.Den som anropar måste ha en attached thread state.
Tillagd i version 3.7.
-
PyObject *PyInterpreterState_GetDict(PyInterpreterState *interp)¶
- En del av Stabil ABI sedan version 3.8.
Returnerar en ordbok i vilken tolkspecifika data kan lagras. Om denna funktion returnerar
NULL
har inget undantag uppstått och den som anropar bör anta att ingen tolkspecifik dict finns tillgänglig.Detta är inte en ersättning för
PyModule_GetState()
, som tillägg bör använda för att lagra tolkspecifik tillståndsinformation.Tillagd i version 3.8.
-
typedef PyObject *(*_PyFrameEvalFunction)(PyThreadState *tstate, _PyInterpreterFrame *frame, int throwflag)¶
Typ av utvärderingsfunktion för en ram.
Parametern throwflag används av generatorns metod
throw()
: om den är icke-noll, hanteras det aktuella undantaget.Ändrad i version 3.9: Funktionen tar nu en tstate parameter.
Ändrad i version 3.11: Parametern frame ändrades från
PyFrameObject*
till_PyInterpreterFrame*
.
-
_PyFrameEvalFunction _PyInterpreterState_GetEvalFrameFunc(PyInterpreterState *interp)¶
Hämta funktionen för utvärdering av ramen.
Se PEP 523 ”Lägga till ett API för ramutvärdering till CPython”.
Tillagd i version 3.9.
-
void _PyInterpreterState_SetEvalFrameFunc(PyInterpreterState *interp, _PyFrameEvalFunction eval_frame)¶
Ställ in funktionen för utvärdering av ramen.
Se PEP 523 ”Lägga till ett API för ramutvärdering till CPython”.
Tillagd i version 3.9.
-
PyObject *PyThreadState_GetDict()¶
- Returnera värde: Lånad referens. En del av Stabil ABI.
Returnerar en ordbok där tillägg kan lagra trådspecifik tillståndsinformation. Varje tillägg bör använda en unik nyckel som används för att lagra tillstånd i ordlistan. Det är okej att anropa denna funktion när ingen thread state är attached. Om denna funktion returnerar
NULL
har inget undantag uppstått och den som anropar bör anta att inget trådtillstånd är kopplat.
-
int PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc)¶
- En del av Stabil ABI.
Asynkronisera ett undantag i en tråd. Argumentet id är tråd-id för måltråden; exc är undantagsobjektet som ska utlösas. Denna funktion stjäl inte några referenser till exc. För att förhindra naivt missbruk måste du skriva ditt eget C-tillägg för att anropa detta. Måste anropas med en attached thread state. Returnerar antalet modifierade trådtillstånd; detta är normalt ett, men kommer att vara noll om tråd-id inte hittas. Om exc är
NULL
, rensas det väntande undantaget (om det finns något) för tråden. Detta ger inte upphov till några undantag.Ändrad i version 3.7: Typen av parametern id ändrades från long till unsigned long.
-
void PyEval_AcquireThread(PyThreadState *tstate)¶
- En del av Stabil ABI.
Attach tstate till den aktuella tråden, som inte får vara
NULL
eller redan attached.Den anropande tråden får inte redan ha ett attached thread state.
Anteckning
Om du anropar den här funktionen från en tråd när körtiden håller på att slutföras kommer tråden att hänga kvar tills programmet avslutas, även om tråden inte skapades av Python. Se Försiktighetsåtgärder avseende runtime-finalisering för mer information.
Ändrad i version 3.8: Uppdaterad för att överensstämma med
PyEval_RestoreThread()
,Py_END_ALLOW_THREADS()
, ochPyGILState_Ensure()
, och avsluta den aktuella tråden om den anropas medan tolken håller på att slutföras.Ändrad i version 3.14: Hänger den aktuella tråden i stället för att avsluta den, om den anropas medan tolken håller på att slutföras.
PyEval_RestoreThread()
är en funktion på högre nivå som alltid är tillgänglig (även när trådar inte har initialiserats).
-
void PyEval_ReleaseThread(PyThreadState *tstate)¶
- En del av Stabil ABI.
Avlägsna attached thread state. Argumentet tstate, som inte får vara
NULL
, används bara för att kontrollera att det representerar attached thread state — om det inte gör det, rapporteras ett allvarligt fel.PyEval_SaveThread()
är en funktion på högre nivå som alltid är tillgänglig (även när trådar inte har initialiserats).
Stöd för undertolkning¶
Även om du i de flesta fall bara kommer att bädda in en enda Python-tolk, finns det fall där du behöver skapa flera oberoende tolkar i samma process och kanske till och med i samma tråd. Undertolkare gör det möjligt för dig att göra det.
Tolken ”main” är den första som skapas när runtime initialiseras. Det är vanligtvis den enda Python-tolken i en process. Till skillnad från undertolkare har huvudtolkaren unika processglobala ansvarsområden som signalhantering. Den är också ansvarig för exekvering under initiering av körtiden och är vanligtvis den aktiva tolken under slutförande av körtiden. Funktionen PyInterpreterState_Main()
returnerar en pekare till dess tillstånd.
Du kan växla mellan undertolkare med hjälp av funktionen PyThreadState_Swap()
. Du kan skapa och förstöra dem med hjälp av följande funktioner:
-
type PyInterpreterConfig¶
Struktur som innehåller de flesta parametrar för att konfigurera en sub-tolk. Dess värden används endast i
Py_NewInterpreterFromConfig()
och ändras aldrig av körtiden.Tillagd i version 3.12.
Strukturfält:
-
int use_main_obmalloc¶
Om detta är
0
kommer undertolken att använda sitt eget ”objekt”-allokeringstillstånd. Annars kommer den att använda (dela) huvudtolkens.Om detta är
0
så måstecheck_multi_interp_extensions
vara1
(icke-noll). Om detta är1
så får integil
varaPyInterpreterConfig_OWN_GIL
.
-
int allow_fork¶
Om detta är
0
kommer körtiden inte att stödja forking av processen i någon tråd där undertolken för närvarande är aktiv. Annars är fork obegränsad.Observera att modulen
subprocess
fortfarande fungerar när fork inte är tillåtet.
-
int allow_exec¶
Om detta är
0
kommer körtiden inte att stödja ersättning av den aktuella processen via exec (t.ex.os.execv()
) i någon tråd där undertolken för närvarande är aktiv. Annars är exec obegränsat.Observera att modulen
subprocess
fortfarande fungerar när exec inte är tillåtet.
-
int allow_threads¶
Om detta är
0
så kommer undertolkarens modulthreading
inte att skapa trådar. Annars är trådar tillåtna.
-
int allow_daemon_threads¶
Om detta är
0
så kommer inte undertolkarens modulthreading
att skapa daemon-trådar. Annars är daemon-trådar tillåtna (så länge somallow_threads
är icke-noll).
-
int check_multi_interp_extensions¶
Om detta är
0
så kan alla tilläggsmoduler importeras, inklusive äldre moduler (enfasig init), i alla trådar där undertolkaren för närvarande är aktiv. Annars får endast tilläggsmoduler för flerfasig init (se PEP 489) importeras. (Se ävenPy_mod_multiple_interpreters
.)Detta måste vara
1
(icke-noll) omuse_main_obmalloc
är0
.
-
int gil¶
Detta bestämmer hur GIL ska fungera för undertolken. Det kan vara något av följande:
-
PyInterpreterConfig_DEFAULT_GIL¶
Använd standardvalet (
PyInterpreterConfig_SHARED_GIL
).
-
PyInterpreterConfig_SHARED_GIL¶
Använd (dela) huvudtolkens GIL.
-
PyInterpreterConfig_OWN_GIL¶
Använd undertolkarens egen GIL.
Om detta är
PyInterpreterConfig_OWN_GIL
så måstePyInterpreterConfig.use_main_obmalloc
vara0
.-
PyInterpreterConfig_DEFAULT_GIL¶
-
int use_main_obmalloc¶
-
PyStatus Py_NewInterpreterFromConfig(PyThreadState **tstate_p, const PyInterpreterConfig *config)¶
Skapa en ny subinterpreter. Detta är en (nästan) helt separat miljö för exekvering av Python-kod. I synnerhet har den nya tolken separata, oberoende versioner av alla importerade moduler, inklusive de grundläggande modulerna
builtins
,__main__
ochsys
. Tabellen över inlästa moduler (sys.modules
) och sökvägen för moduler (sys.path
) är också separata. Den nya miljön har ingen variabelsys.argv
. Den har nya standard I/O-strömfilobjektsys.stdin
,sys.stdout
ochsys.stderr
(dessa hänvisar dock till samma underliggande filbeskrivare).Den angivna config styr de alternativ som tolken initieras med.
Vid framgång kommer tstate_p att sättas till det första thread state som skapats i den nya sub-interpretern. Detta trådtillstånd är attached. Observera att ingen egentlig tråd skapas; se diskussionen om trådtillstånd nedan. Om skapandet av den nya tolken misslyckas, sätts tstate_p till
NULL
; inget undantag sätts eftersom undantagstillståndet lagras i attached thread state, som kanske inte existerar.Liksom alla andra Python/C API-funktioner måste ett attached thread state finnas innan denna funktion anropas, men det kan vara fristående när funktionen returneras. Vid framgång kommer det returnerade trådtillståndet att vara attached. Om subtolken skapas med sin egen GIL kommer attached thread state för den anropande tolken att lösgöras. När funktionen returneras kommer den nya tolkens thread state att vara attached till den aktuella tråden och den föregående tolkens attached thread state kommer att förbli detached.
Tillagd i version 3.12.
Undertolkar är mest effektiva när de är isolerade från varandra, med vissa funktioner begränsade:
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); }
Observera att config endast används kortvarigt och inte ändras. Under initialiseringen konverteras configs värden till olika
PyInterpreterState
-värden. En skrivskyddad kopia av config kan lagras internt påPyInterpreterState
.Tilläggsmoduler delas mellan (under)tolkarna enligt följande:
För moduler som använder initialisering i flera faser, t.ex.
PyModule_FromDefAndSpec()
, skapas och initieras ett separat modulobjekt för varje tolk. Endast statiska och globala variabler på C-nivå delas mellan dessa modulobjekt.För moduler som använder enfasinitialisering, t.ex.
PyModule_Create()
, initieras ett visst tillägg normalt första gången det importeras, och en (ytlig) kopia av modulens ordbok sparas. När samma tillägg importeras av en annan (under)tolkare initieras en ny modul och fylls med innehållet i denna kopia; tilläggetsinit
-funktion anropas inte. Objekten i modulens ordbok delas därmed mellan (under)tolkarna, vilket kan orsaka oönskat beteende (se Bugs and caveats nedan).Observera att detta skiljer sig från vad som händer när ett tillägg importeras efter att tolken har initialiserats helt på nytt genom anrop av
Py_FinalizeEx()
ochPy_Initialize()
; i så fall anropas tilläggets funktioninitmodule
igen. Precis som med initialisering i flera faser innebär detta att endast statiska och globala variabler på C-nivå delas mellan dessa moduler.
-
PyThreadState *Py_NewInterpreter(void)¶
- En del av Stabil ABI.
Skapa en ny under-tolk. Detta är i huvudsak bara ett omslag runt
Py_NewInterpreterFromConfig()
med en konfiguration som bevarar det befintliga beteendet. Resultatet är en oisolerad undertolk som delar huvudtolkens GIL, tillåter fork/exec, tillåter daemon-trådar och tillåter enfasiga init-moduler.
-
void Py_EndInterpreter(PyThreadState *tstate)¶
- En del av Stabil ABI.
Förstör den (under)tolk som representeras av den angivna thread state. Det givna trådtillståndet måste vara attached. När anropet returneras kommer det inte att finnas något attached thread state. Alla trådtillstånd som är associerade med denna tolk förstörs.
Py_FinalizeEx()
kommer att förstöra alla undertolkare som inte uttryckligen har förstörts vid den tidpunkten.
A Per tolk GIL¶
Med Py_NewInterpreterFromConfig()
kan du skapa en subtolk som är helt isolerad från andra tolkar, inklusive att ha sin egen GIL. Den viktigaste fördelen med denna isolering är att en sådan tolk kan exekvera Python-kod utan att blockeras av andra tolkar eller blockera några andra. På så sätt kan en enda Python-process verkligen dra nytta av flera processorkärnor när den kör Python-kod. Isoleringen uppmuntrar också till ett annat sätt att hantera samtidighet än att bara använda trådar. (Se PEP 554.)
Att använda en isolerad tolk kräver vaksamhet när det gäller att bevara isoleringen. Det innebär särskilt att inte dela några objekt eller föränderligt tillstånd utan garantier om trådsäkerhet. Även objekt som annars är oföränderliga (t.ex. None
, (1, 5)
) kan normalt inte delas på grund av refcount. En enkel men mindre effektiv metod för att komma runt detta är att använda ett globalt lås för all användning av ett tillstånd (eller objekt). Alternativt kan effektivt oföränderliga objekt (som heltal eller strängar) göras säkra trots deras refcount genom att göra dem till immortal. Faktum är att detta har gjorts för de inbyggda singletonerna, små heltal och ett antal andra inbyggda objekt.
Om du bevarar isoleringen kommer du att få tillgång till riktiga flerkärniga datorer utan de komplikationer som följer med free-threading. Om du inte bevarar isoleringen kommer du att utsättas för alla konsekvenser av free-threading, inklusive tävlingar och krascher som är svåra att felsöka.
Bortsett från det är en av de största utmaningarna med att använda flera isolerade tolkar hur man kommunicerar mellan dem på ett säkert (inte bryta isoleringen) och effektivt sätt. Runtime och stdlib tillhandahåller ännu inte någon standardmetod för detta. En framtida stdlib-modul skulle hjälpa till att minska ansträngningen att bevara isoleringen och exponera effektiva verktyg för att kommunicera (och dela) data mellan tolkar.
Tillagd i version 3.12.
Buggar och förbehåll¶
Eftersom undertolkar (och huvudtolken) är en del av samma process är isoleringen mellan dem inte perfekt — till exempel kan de (av misstag eller illvilligt) påverka varandras öppna filer genom att använda filoperationer på låg nivå som os.close()
. På grund av det sätt som tillägg delas mellan (under)tolkar kan det hända att vissa tillägg inte fungerar korrekt; detta är särskilt troligt när man använder enfasinitialisering eller (statiska) globala variabler. Det är möjligt att infoga objekt som skapats i en subtolk i ett namnrymd i en annan (sub-)tolk; detta bör undvikas om möjligt.
Särskild försiktighet bör iakttas för att undvika att dela användardefinierade funktioner, metoder, instanser eller klasser mellan undertolkare, eftersom importoperationer som utförs av sådana objekt kan påverka fel (under)tolkares ordlista över inlästa moduler. Det är lika viktigt att undvika att dela objekt från vilka ovanstående kan nås.
Notera också att det är känsligt att kombinera denna funktionalitet med PyGILState_*
API:er, eftersom dessa API:er antar en bijektion mellan Python-trådtillstånd och trådar på OS-nivå, ett antagande som bryts av närvaron av undertolkare. Det rekommenderas starkt att du inte byter undertolkare mellan ett par matchande PyGILState_Ensure()
- och PyGILState_Release()
-anrop. Dessutom kommer tillägg (som ctypes
) som använder dessa API:er för att tillåta anrop av Python-kod från trådar som inte skapats av Python förmodligen att brytas när man använder undertolkare.
Asynkrona notifieringar¶
Det finns en mekanism för att göra asynkrona meddelanden till tolkens huvudtråd. Dessa meddelanden har formen av en funktionspekare och ett void-pekarargument.
-
int Py_AddPendingCall(int (*func)(void*), void *arg)¶
- En del av Stabil ABI.
Schemalägg en funktion som ska anropas från tolkens huvudtråd. Vid framgång returneras
0
och func köas för att anropas i huvudtråden. Vid misslyckande returneras-1
utan att något undantag anges.När func har köats framgångsrikt kommer den evventuellt att anropas från tolkens huvudtråd med argumentet arg. Den kommer att anropas asynkront i förhållande till normalt körande Python-kod, men med båda dessa villkor uppfyllda:
på en bytecode-gräns;
med huvudtråden som håller en attached thread state (func kan därför använda hela C API).
func måste returnera
0
vid framgång, eller-1
vid misslyckande med en undantagsuppsättning. func kommer inte att avbrytas för att utföra ett annat asynkront meddelande rekursivt, men det kan fortfarande avbrytas för att byta tråd om thread state är fristående.Denna funktion behöver inte en attached thread state. Men för att anropa denna funktion i en subinterpreter måste anroparen ha en attached thread state. Annars kan funktionen func schemaläggas så att den anropas från fel tolk.
Varning
Detta är en lågnivåfunktion som endast är användbar i mycket speciella fall. Det finns ingen garanti för att func kommer att anropas så snabbt som möjligt. Om huvudtråden är upptagen med att utföra ett systemanrop kommer func inte att anropas innan systemanropet returneras. Den här funktionen är i allmänhet inte lämplig för anrop av Python-kod från godtyckliga C-trådar. Använd istället PyGILState API.
Tillagd i version 3.1.
Ändrad i version 3.9: Om denna funktion anropas i en subinterpreter är funktionen func nu schemalagd att anropas från subinterpretern, istället för att anropas från huvudinterpretern. Varje undertolk har nu sin egen lista över schemalagda anrop.
Profilering och spårning¶
Python-tolken ger stöd på låg nivå för att koppla till profilerings- och exekveringsspårningsfunktioner. Dessa används för verktyg för profilering, felsökning och täckningsanalys.
Detta C-gränssnitt gör det möjligt för profilerings- eller spårningskoden att undvika omkostnaderna för anrop via anropsbara objekt på Python-nivå och istället göra ett direkt anrop av C-funktioner. De viktigaste egenskaperna hos funktionen har inte ändrats; gränssnittet gör att spårningsfunktioner kan installeras per tråd och de grundläggande händelser som rapporteras till spårningsfunktionen är desamma som rapporterades till spårningsfunktionerna på Python-nivå i tidigare versioner.
-
typedef int (*Py_tracefunc)(PyObject *obj, PyFrameObject *frame, int what, PyObject *arg)¶
Typ av spårningsfunktion som registrerats med
PyEval_SetProfile()
ochPyEval_SetTrace()
. Den första parametern är det objekt som skickas till registreringsfunktionen som obj, frame är det frame-objekt som händelsen gäller, what är en av konstanternaPyTrace_CALL
,PyTrace_EXCEPTION
,PyTrace_LINE
,PyTrace_RETURN
,PyTrace_C_CALL
,PyTrace_C_EXCEPTION
,PyTrace_C_RETURN
, ellerPyTrace_OPCODE
, och arg beror på värdet av what:Värde av vad
Betydelse av arg
Alltid
Py_None
.Information om undantag som returneras av
sys.exc_info()
.Alltid
Py_None
.Värde som returneras till den som anropar, eller
NULL
om det orsakas av ett undantag.Funktionsobjekt som anropas.
Funktionsobjekt som anropas.
Funktionsobjekt som anropas.
Alltid
Py_None
.
-
int PyTrace_CALL¶
Värdet på what-parametern till en
Py_tracefunc
-funktion när ett nytt anrop till en funktion eller metod rapporteras, eller en ny inmatning i en generator. Observera att skapandet av iteratorn för en generatorfunktion inte rapporteras eftersom det inte sker någon kontrollöverföring till Python-bytekoden i motsvarande ram.
-
int PyTrace_EXCEPTION¶
Värdet på what parametern till en
Py_tracefunc
funktion när ett undantag har uppstått. Återkallningsfunktionen anropas med detta värde för what när efter att någon bytecode har bearbetats varefter undantaget blir inställt inom den ram som exekveras. Effekten av detta är att eftersom undantagsutbredningen gör att Python-stacken rullas upp, anropas callbacken vid återkomst till varje ram när undantaget sprids. Endast spårningsfunktioner tar emot dessa händelser; de behövs inte av profileraren.
-
int PyTrace_LINE¶
Det värde som skickas som what-parameter till en
Py_tracefunc
-funktion (men inte en profileringsfunktion) när en radnummerhändelse rapporteras. Den kan inaktiveras för en bildruta genom att sättaf_trace_lines
till 0 för den bildrutan.
-
int PyTrace_RETURN¶
Värdet för what-parametern till
Py_tracefunc
-funktioner när ett anrop är på väg att returneras.
-
int PyTrace_C_CALL¶
Värdet för what-parametern till
Py_tracefunc
-funktioner när en C-funktion ska anropas.
-
int PyTrace_C_EXCEPTION¶
Värdet för what-parametern till
Py_tracefunc
-funktioner när en C-funktion har orsakat ett undantag.
-
int PyTrace_C_RETURN¶
Värdet för what-parametern till
Py_tracefunc
-funktioner när en C-funktion har returnerats.
-
int PyTrace_OPCODE¶
Värdet för what-parametern till
Py_tracefunc
-funktioner (men inte profileringsfunktioner) när en ny opcode ska exekveras. Denna händelse sänds inte ut som standard: den måste uttryckligen begäras genom att ställa inf_trace_opcodes
till 1 på ramen.
-
void PyEval_SetProfile(Py_tracefunc func, PyObject *obj)¶
Ställ in profileringsfunktionen till func. Parametern obj skickas till funktionen som dess första parameter och kan vara vilket Python-objekt som helst eller
NULL
. Om profilfunktionen behöver upprätthålla tillstånd är det praktiskt och trådsäkert att använda ett annat värde för obj för varje tråd för att lagra det. Profilfunktionen anropas för alla övervakade händelser utomPyTrace_LINE
PyTrace_OPCODE
ochPyTrace_EXCEPTION
.Se även funktionen
sys.setprofile()
.Den som anropar måste ha en attached thread state.
-
void PyEval_SetProfileAllThreads(Py_tracefunc func, PyObject *obj)¶
Som
PyEval_SetProfile()
men ställer in profilfunktionen i alla pågående trådar som tillhör den aktuella tolken istället för att bara ställa in den i den aktuella tråden.Den som anropar måste ha en attached thread state.
Precis som
PyEval_SetProfile()
ignorerar denna funktion alla undantag som uppstår när profilfunktionerna ställs in i alla trådar.
Tillagd i version 3.12.
-
void PyEval_SetTrace(Py_tracefunc func, PyObject *obj)¶
Ställ in spårningsfunktionen till func. Detta liknar
PyEval_SetProfile()
, förutom att spårningsfunktionen tar emot händelser som rör radnummer och per-opcode, men inte händelser som rör anrop av C-funktionsobjekt. En spårningsfunktion som registreras medPyEval_SetTrace()
kommer inte att ta emotPyTrace_C_CALL
,PyTrace_C_EXCEPTION
ellerPyTrace_C_RETURN
som värde för parametern what.Se även funktionen
sys.settrace()
.Den som anropar måste ha en attached thread state.
-
void PyEval_SetTraceAllThreads(Py_tracefunc func, PyObject *obj)¶
Som
PyEval_SetTrace()
men ställer in spårningsfunktionen i alla pågående trådar som tillhör den aktuella tolken istället för att bara ställa in den i den aktuella tråden.Den som anropar måste ha en attached thread state.
Precis som
PyEval_SetTrace()
ignorerar denna funktion alla undantag som uppstår när spårningsfunktionerna ställs in i alla trådar.
Tillagd i version 3.12.
Referensspårning¶
Tillagd i version 3.13.
-
typedef int (*PyRefTracer)(PyObject*, int event, void *data)¶
Typen av spårningsfunktion som registrerats med
PyRefTracer_SetTracer()
. Den första parametern är ett Python-objekt som just har skapats (när event är satt tillPyRefTracer_CREATE
) eller håller på att förstöras (när event är satt tillPyRefTracer_DESTROY
). Argumentet data är den opaka pekare som tillhandahölls närPyRefTracer_SetTracer()
anropades.
Tillagd i version 3.13.
-
int PyRefTracer_CREATE¶
Värdet för parametern event till
PyRefTracer
-funktioner när ett Python-objekt har skapats.
-
int PyRefTracer_DESTROY¶
Värdet för parametern event till
PyRefTracer
-funktioner när ett Python-objekt har förstörts.
-
int PyRefTracer_SetTracer(PyRefTracer tracer, void *data)¶
Registrera en funktion för referensspårning. Funktionen kommer att anropas när en ny Python har skapats eller när ett objekt ska förstöras. Om data anges måste det vara en ogenomskinlig pekare som kommer att anges när spårningsfunktionen anropas. Returnera
0
vid framgång. Ställ in ett undantag och returnera-1
vid fel.Observera att spårningsfunktioner inte får skapa Python-objekt inuti, annars kommer anropet att vara re-entrant. Spåraren får inte heller tömma något befintligt undantag eller skapa ett undantag. En thread state kommer att vara aktiv varje gång tracerfunktionen anropas.
Det måste finnas en attached thread state när denna funktion anropas.
Tillagd i version 3.13.
-
PyRefTracer PyRefTracer_GetTracer(void **data)¶
Hämtar den registrerade referensspårningsfunktionen och värdet på den opaka datapekaren som registrerades när
PyRefTracer_SetTracer()
anropades. Om ingen spårningsfunktion registrerades returnerar denna funktion NULL och sätter pekaren data till NULL.Det måste finnas en attached thread state när denna funktion anropas.
Tillagd i version 3.13.
Avancerat stöd för felsökare¶
Dessa funktioner är endast avsedda att användas av avancerade felsökningsverktyg.
-
PyInterpreterState *PyInterpreterState_Head()¶
Returnerar tolkens statusobjekt längst upp i listan över alla sådana objekt.
-
PyInterpreterState *PyInterpreterState_Main()¶
Returnerar huvudtolkens statusobjekt.
-
PyInterpreterState *PyInterpreterState_Next(PyInterpreterState *interp)¶
Returnerar nästa tolktillståndsobjekt efter interp från listan över alla sådana objekt.
-
PyThreadState *PyInterpreterState_ThreadHead(PyInterpreterState *interp)¶
Returnerar pekaren till det första
PyThreadState
-objektet i listan över trådar som är associerade med tolken interp.
-
PyThreadState *PyThreadState_Next(PyThreadState *tstate)¶
Returnerar nästa trådtillståndsobjekt efter tstate från listan över alla sådana objekt som tillhör samma
PyInterpreterState
-objekt.
Tråd Stöd för lokal lagring¶
Python-tolken ger stöd på låg nivå för trådlokal lagring (TLS) som omsluter den underliggande inbyggda TLS-implementeringen för att stödja API:et för trådlokal lagring på Python-nivå (threading.local
). CPythons API:er på C-nivå liknar de som erbjuds av pthreads och Windows: använd en trådnyckel och funktioner för att associera ett void*-värde per tråd.
En thread state behöver inte vara attached när dessa funktioner anropas; de kompletterar sin egen låsning.
Observera att Python.h
inte innehåller deklarationen av TLS API:erna, du måste inkludera pythread.h
för att använda trådlokal lagring.
Anteckning
Ingen av dessa API-funktioner hanterar minneshantering för void*-värdenas räkning. Du måste allokera och avallokera dem själv. Om void*-värdena råkar vara PyObject*, utför dessa funktioner inte heller refcount-operationer på dem.
API för trådspecifik lagring (TSS)¶
TSS API introduceras för att ersätta användningen av det befintliga TLS API inom CPython-tolken. Detta API använder en ny typ Py_tss_t
istället för int för att representera trådnycklar.
Tillagd i version 3.7.
Se även
”Ett nytt C-API för trådlokal lagring i CPython” (PEP 539)
-
type Py_tss_t¶
Denna datastruktur representerar tillståndet för en trådnyckel, vars definition kan bero på den underliggande TLS-implementeringen, och den har ett internt fält som representerar nyckelns initialiseringstillstånd. Det finns inga offentliga medlemmar i denna struktur.
När Py_LIMITED_API inte är definierad, tillåts statisk allokering av denna typ genom
Py_tss_NEEDS_INIT
.
-
Py_tss_NEEDS_INIT¶
Detta makro expanderar till initialiseraren för
Py_tss_t
-variabler. Observera att detta makro inte kommer att definieras med Py_LIMITED_API.
Dynamisk allokering¶
Dynamisk allokering av Py_tss_t
, krävs i tilläggsmoduler byggda med Py_LIMITED_API, där statisk allokering av denna typ inte är möjlig på grund av att dess implementation är ogenomskinlig vid byggtiden.
-
Py_tss_t *PyThread_tss_alloc()¶
- En del av Stabil ABI sedan version 3.7.
Returnerar ett värde som är i samma tillstånd som ett värde som initierats med
Py_tss_NEEDS_INIT
, ellerNULL
om dynamisk allokering misslyckats.
-
void PyThread_tss_free(Py_tss_t *key)¶
- En del av Stabil ABI sedan version 3.7.
Frigör den givna key som allokerats av
PyThread_tss_alloc()
, efter att först ha anropatPyThread_tss_delete()
för att säkerställa att alla associerade trådlokaler har avallokerats. Detta är ett no-op om argumentet key ärNULL
.Anteckning
En frigjord nyckel blir en hängande pekare. Du bör återställa nyckeln till
NULL
.
Metoder¶
Parametern key i dessa funktioner får inte vara NULL
. Dessutom är beteendena hos PyThread_tss_set()
och PyThread_tss_get()
odefinierade om den givna Py_tss_t
inte har initialiserats av PyThread_tss_create()
.
-
int PyThread_tss_is_created(Py_tss_t *key)¶
- En del av Stabil ABI sedan version 3.7.
Returnerar ett värde som inte är noll om den angivna
Py_tss_t
har initialiserats avPyThread_tss_create()
.
-
int PyThread_tss_create(Py_tss_t *key)¶
- En del av Stabil ABI sedan version 3.7.
Returnerar ett nollvärde vid lyckad initialisering av en TSS-nyckel. Beteendet är odefinierat om det värde som pekas ut av argumentet key inte initieras av
Py_tss_NEEDS_INIT
. Denna funktion kan anropas upprepade gånger på samma nyckel - att anropa den på en redan initialiserad nyckel är en no-op och returnerar omedelbart framgång.
-
void PyThread_tss_delete(Py_tss_t *key)¶
- En del av Stabil ABI sedan version 3.7.
Förstör en TSS-nyckel för att glömma de värden som är associerade med nyckeln i alla trådar och ändra nyckelns initialiseringstillstånd till uninitialized. En förstörd nyckel kan initialiseras igen med
PyThread_tss_create()
. Den här funktionen kan anropas upprepade gånger på samma nyckel - att anropa den på en redan förstörd nyckel är inte möjligt.
-
int PyThread_tss_set(Py_tss_t *key, void *value)¶
- En del av Stabil ABI sedan version 3.7.
Returnerar ett nollvärde för att indikera att ett void*-värde har associerats med en TSS-nyckel i den aktuella tråden. Varje tråd har en distinkt mappning av nyckeln till ett void*-värde.
-
void *PyThread_tss_get(Py_tss_t *key)¶
- En del av Stabil ABI sedan version 3.7.
Returnerar det void*-värde som associeras med en TSS-nyckel i den aktuella tråden. Returnerar
NULL
om inget värde är associerat med nyckeln i den aktuella tråden.
API för lokal lagring av trådar (TLS)¶
Föråldrad sedan version 3.7: Detta API ersätts av Thread Specific Storage (TSS) API.
Anteckning
Den här versionen av API:et stöder inte plattformar där den ursprungliga TLS-nyckeln definieras på ett sätt som inte säkert kan kastas till int
. På sådana plattformar kommer PyThread_create_key()
att returnera omedelbart med en felstatus, och de andra TLS-funktionerna kommer alla att vara no-ops på sådana plattformar.
På grund av det kompatibilitetsproblem som nämns ovan bör denna version av API:et inte användas i ny kod.
-
int PyThread_create_key()¶
- En del av Stabil ABI.
-
void PyThread_delete_key(int key)¶
- En del av Stabil ABI.
-
int PyThread_set_key_value(int key, void *value)¶
- En del av Stabil ABI.
-
void *PyThread_get_key_value(int key)¶
- En del av Stabil ABI.
-
void PyThread_delete_key_value(int key)¶
- En del av Stabil ABI.
-
void PyThread_ReInitTLS()¶
- En del av Stabil ABI.
Synkroniseringsprimitiver¶
C-API tillhandahåller ett grundläggande lås med ömsesidig uteslutning.
-
type PyMutex¶
Ett ömsesidigt uteslutningslås.
PyMutex
bör initialiseras till noll för att representera det olåsta tillståndet. Till exempel:PyMutex mutex = {0};
Instanser av
PyMutex
bör inte kopieras eller flyttas. Både innehållet och adressen i enPyMutex
är meningsfulla och den måste ligga kvar på en fast, skrivbar plats i minnet.Anteckning
En
PyMutex
upptar för närvarande en byte, men storleken bör betraktas som instabil. Storleken kan komma att ändras i framtida Python-utgåvor utan en utfasningsperiod.Tillagd i version 3.13.
-
void PyMutex_Lock(PyMutex *m)¶
Låser mutex m. Om en annan tråd redan har låst den, kommer den anropande tråden att blockera tills mutexen låses upp. Under blockeringen kommer tråden tillfälligt att ta bort thread state om en sådan finns.
Tillagd i version 3.13.
-
void PyMutex_Unlock(PyMutex *m)¶
Lås upp mutex m. Mutex måste vara låst — annars kommer funktionen att utfärda ett fatalt fel.
Tillagd i version 3.13.
-
int PyMutex_IsLocked(PyMutex *m)¶
Returnerar icke-noll om mutex m för närvarande är låst, noll annars.
Anteckning
Den här funktionen är endast avsedd att användas i samband med påståenden och felsökning och bör inte användas för att fatta beslut om samtidighetskontroll, eftersom låsets tillstånd kan ändras omedelbart efter kontrollen.
Tillagd i version 3.14.
Python API för kritiska avsnitt¶
API:et för kritiska sektioner tillhandahåller ett lager för att undvika deadlock ovanpå lås per objekt för free-threaded CPython. De är avsedda att ersätta beroendet av global interpreter lock, och är no-ops i versioner av Python med global interpreter lock.
Critical sections are intended to be used for custom types implemented
in C-API extensions. They should generally not be used with built-in types like
list
and dict
because their public C-APIs
already use critical sections internally, with the notable
exception of PyDict_Next()
, which requires critical section
to be acquired externally.
Critical sections avoid deadlocks by implicitly suspending active critical
sections, hence, they do not provide exclusive access such as provided by
traditional locks like PyMutex
. When a critical section is started,
the per-object lock for the object is acquired. If the code executed inside the
critical section calls C-API functions then it can suspend the critical section thereby
releasing the per-object lock, so other threads can acquire the per-object lock
for the same object.
Varianter som accepterar PyMutex
-pekare i stället för Python-objekt finns också tillgängliga. Använd dessa varianter för att starta ett kritiskt avsnitt i en situation där det inte finns någon PyObject
– till exempel när du arbetar med en C-typ som inte utökar eller omsluter PyObject
men som ändå behöver anropa C API:et på ett sätt som kan leda till dödlägen.
De funktioner och strukturer som används av makron är exponerade för fall där C-makron inte är tillgängliga. De bör endast användas som i de givna makroexpansionerna. Observera att strukturernas storlek och innehåll kan komma att ändras i framtida Python-versioner.
Anteckning
Operationer som behöver låsa två objekt samtidigt måste använda Py_BEGIN_CRITICAL_SECTION2
. Du kan inte använda nästlade kritiska avsnitt för att låsa mer än ett objekt samtidigt, eftersom det inre kritiska avsnittet kan avbryta de yttre kritiska avsnitten. Detta API tillhandahåller inte något sätt att låsa mer än två objekt samtidigt.
Exempel på användning:
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;
}
I exemplet ovan anropar Py_SETREF
Py_DECREF
, som kan anropa godtycklig kod via ett objekts deallokeringsfunktion. API:et för kritiska sektioner undviker potentiella dödlägen på grund av reentrancy och låsordning genom att tillåta runtime att tillfälligt avbryta den kritiska sektionen om koden som utlöses av finalizer blockerar och anropar PyEval_SaveThread()
.
-
Py_BEGIN_CRITICAL_SECTION(op)¶
Förvärvar låset per objekt för objektet op och påbörjar ett kritiskt avsnitt.
I den fritt trådade versionen expanderar detta makro till:
{ PyCriticalSection _py_cs; PyCriticalSection_Begin(&_py_cs, (PyObject*)(op))
I standardutförandet expanderar detta makro till
{
.Tillagd i version 3.13.
-
Py_BEGIN_CRITICAL_SECTION_MUTEX(m)¶
Låser mutex m och påbörjar en kritisk sektion.
I den fritt trådade versionen expanderar detta makro till:
{ PyCriticalSection _py_cs; PyCriticalSection_BeginMutex(&_py_cs, m)
Observera att till skillnad från
Py_BEGIN_CRITICAL_SECTION
finns det ingen cast för argumentet i makrot - det måste vara enPyMutex
-pekare.I standardutförandet expanderar detta makro till
{
.Tillagd i version 3.14.
-
Py_END_CRITICAL_SECTION()¶
Avslutar det kritiska avsnittet och frigör låset per objekt.
I den fritt trådade versionen expanderar detta makro till:
PyCriticalSection_End(&_py_cs); }
I standardutförandet expanderar detta makro till
}
.Tillagd i version 3.13.
-
Py_BEGIN_CRITICAL_SECTION2(a, b)¶
Förvärvar låsen per objekt för objekten a och b och påbörjar en kritisk sektion. Låsen förvärvas i en konsekvent ordning (lägsta adress först) för att undvika låsningsdödlägen.
I den fritt trådade versionen expanderar detta makro till:
{ PyCriticalSection2 _py_cs2; PyCriticalSection2_Begin(&_py_cs2, (PyObject*)(a), (PyObject*)(b))
I standardutförandet expanderar detta makro till
{
.Tillagd i version 3.13.
-
Py_BEGIN_CRITICAL_SECTION2_MUTEX(m1, m2)¶
Låser mutexarna m1 och m2 och påbörjar en kritisk sektion.
I den fritt trådade versionen expanderar detta makro till:
{ PyCriticalSection2 _py_cs2; PyCriticalSection2_BeginMutex(&_py_cs2, m1, m2)
Observera att till skillnad från
Py_BEGIN_CRITICAL_SECTION2
finns det ingen cast för argumenten i makrot - de måste varaPyMutex
-pekare.I standardutförandet expanderar detta makro till
{
.Tillagd i version 3.14.
-
Py_END_CRITICAL_SECTION2()¶
Avslutar det kritiska avsnittet och frigör låsen per objekt.
I den fritt trådade versionen expanderar detta makro till:
PyCriticalSection2_End(&_py_cs2); }
I standardutförandet expanderar detta makro till
}
.Tillagd i version 3.13.