_thread — API för trådning på låg nivå


Denna modul tillhandahåller primitiver på låg nivå för att arbeta med flera trådar (även kallade light-weight processes eller tasks) — flera kontrolltrådar som delar sitt globala datautrymme. För synkronisering tillhandahålls enkla lås (även kallade mutexes eller binary semaphores). Modulen threading tillhandahåller ett mer lättanvänt API för trådning på högre nivå som bygger på denna modul.

Ändrad i version 3.7: Denna modul var tidigare valfri, men är nu alltid tillgänglig.

Denna modul definierar följande konstanter och funktioner:

exception _thread.error

Utlöses vid trådspecifika fel.

Ändrad i version 3.3: Detta är nu en synonym till den inbyggda RuntimeError.

_thread.LockType

Detta är den typ av låsobjekt.

_thread.start_new_thread(function, args[, kwargs])

Starta en ny tråd och returnera dess identifierare. Tråden exekverar funktionen function med argumentlistan args (som måste vara en tupel). Det valfria argumentet kwargs anger en ordlista med nyckelordsargument.

När funktionen återkommer avslutas tråden tyst.

När funktionen avslutas med ett ohanterat undantag anropas sys.unraisablehook() för att hantera undantaget. Attributet object för hook-argumentet är function. Som standard skrivs ett stackspår ut och sedan avslutas tråden (men andra trådar fortsätter att köras).

Om funktionen ger upphov till ett SystemExit-undantag ignoreras det i tysthet.

Utlöser en auditing event _thread.start_new_thread med argumenten function, args, kwargs.

Ändrad i version 3.8: sys.unraisablehook() används nu för att hantera obehandlade undantag.

_thread.interrupt_main(signum=signal.SIGINT, /)

Simulerar effekten av en signal som anländer till huvudtråden. En tråd kan använda denna funktion för att avbryta huvudtråden, men det finns ingen garanti för att avbrottet sker omedelbart.

Om signum anges är det numret på den signal som ska simuleras. Om signum inte anges, simuleras signal.SIGINT.

Om den angivna signalen inte hanteras av Python (den sattes till signal.SIG_DFL eller signal.SIG_IGN), gör denna funktion ingenting.

Ändrad i version 3.10: Argumentet signum läggs till för att anpassa signalnumret.

Anteckning

Detta sänder inte ut motsvarande signal utan schemalägger ett anrop till den associerade hanteraren (om den finns). Om du verkligen vill sända ut signalen, använd signal.raise_signal().

_thread.exit()

Utlöser undantaget SystemExit. Om det inte fångas upp kommer det att leda till att tråden avslutas i tysthet.

_thread.allocate_lock()

Returnerar ett nytt låsobjekt. Metoder för lås beskrivs nedan. Låset är initialt olåst.

_thread.get_ident()

Returnerar ”trådidentifieraren” för den aktuella tråden. Detta är ett heltal som inte är noll. Dess värde har ingen direkt betydelse; det är avsett som en magisk cookie som kan användas t.ex. för att indexera en ordbok med trådspecifika data. Trådidentifierare kan återanvändas när en tråd avslutas och en ny tråd skapas.

_thread.get_native_id()

Returnerar det inbyggda integrerade tråd-ID:t för den aktuella tråden som tilldelats av kärnan. Detta är ett icke-negativt heltal. Dess värde kan användas för att unikt identifiera just denna tråd i hela systemet (tills tråden avslutas, varefter värdet kan återanvändas av operativsystemet).

Tillgänglighet: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX, DragonFlyBSD, GNU/kFreeBSD.

Tillagd i version 3.8.

Ändrad i version 3.13: Lagt till stöd för GNU/kFreeBSD.

_thread.stack_size([size])

Returnerar den trådstackstorlek som används när nya trådar skapas. Det valfria argumentet size anger den stackstorlek som ska användas för senare skapade trådar och måste vara 0 (använd plattformens eller konfigurerade standard) eller ett positivt heltalsvärde på minst 32 768 (32 KiB). Om size inte anges används 0. Om ändring av trådstackens storlek inte stöds, uppstår ett RuntimeError. Om den angivna stackstorleken är ogiltig, uppstår ett ValueError och stackstorleken ändras inte. 32 KiB är för närvarande det minsta stödda stackstorleksvärdet för att garantera tillräckligt med stackutrymme för själva tolken. Observera att vissa plattformar kan ha särskilda restriktioner för värden på stackstorleken, t.ex. att den minsta stackstorleken måste vara > 32 KiB eller att allokering måste ske i multiplar av sidstorleken i systemminnet - plattformsdokumentationen bör läsas för mer information (4 KiB-sidor är vanliga; att använda multiplar av 4096 för stackstorleken är det föreslagna tillvägagångssättet i avsaknad av mer specifik information).

Tillgänglighet: Windows, pthreads.

Unix-plattformar med stöd för POSIX-trådar.

_thread.TIMEOUT_MAX

Det högsta tillåtna värdet för parametern timeout i Lock.acquire. Om du anger en timeout som är större än detta värde kommer ett OverflowError att uppstå.

Tillagd i version 3.2.

Låsobjekt har följande metoder:

lock.acquire(blocking=True, timeout=-1)

Utan något valfritt argument förvärvar denna metod låset villkorslöst och väntar vid behov tills det släpps av en annan tråd (endast en tråd i taget kan förvärva ett lås — det är deras existensberättigande).

Om argumentet blocking finns med beror åtgärden på dess värde: om det är falskt förvärvas låset endast om det kan förvärvas omedelbart utan att vänta, medan om det är sant förvärvas låset villkorslöst enligt ovan.

Om argumentet timeout med flyttal är närvarande och positivt, anger det den maximala väntetiden i sekunder innan återgång. Ett negativt timeout-argument anger en obegränsad väntetid. Du kan inte ange en timeout om blocking är false.

Returvärdet är True om låset har förvärvats framgångsrikt, False om så inte är fallet.

Ändrad i version 3.2: Parametern timeout är ny.

Ändrad i version 3.2: Lock acquires kan nu avbrytas av signaler på POSIX.

Ändrad i version 3.14: Lock acquires kan nu avbrytas av signaler i Windows.

lock.release()

Frigör låset. Låset måste ha förvärvats tidigare, men inte nödvändigtvis av samma tråd.

lock.locked()

Returnerar status för låset: True om det har förvärvats av någon tråd, False om inte.

Utöver dessa metoder kan låsobjekt också användas via with-satsen, t.ex.:

import _tråd

a_lock = _thread.allocate_lock()

med a_lock:
    print("a_lock är låst medan detta körs")

Fallgropar:

  • Avbrott går alltid till huvudtråden (undantaget KeyboardInterrupt kommer att tas emot av den tråden)

  • Att anropa sys.exit() eller utlösa undantaget SystemExit är likvärdigt med att anropa _thread.exit().

  • När huvudtråden avslutas är det systemspecifikt om de andra trådarna överlever. På de flesta system dödas de utan att utföra tryfinally-klausuler eller exekvera objektdestruktorer.