om du bara kommer igång i Python och vill lära dig mer, ta Datacamps introduktion till datavetenskap i Python kurs.
introduktion
gängning gör att du kan ha olika delar av processen körs samtidigt (källa: RealPython). Dessa olika delar är vanligtvis individuella och har en separat enhet för utförande som tillhör samma process., Processen är inget annat än ett löpande program som har enskilda enheter som kan köras samtidigt. Till exempel kan en webbläsare vara en process, ETT program som kör flera kameror samtidigt kan vara en process; ett videospel är ett annat exempel på en process.
inuti en process kommer begreppet multipel gängning eller allmänt känd som multi-threading, där flera trådar arbetar tillsammans för att uppnå ett gemensamt mål. Den mest avgörande fördelen med att använda trådar är att det låter dig köra programmet parallellt.,
låt oss förstå begreppet gängning med hjälp av ett exempel. Tänk dig att du har ett program som räknar antalet bilar som kommer in och lämnar köpcentret parkering. Din apparat har olika kameror som övervakar inmatning och utgång anslutning till en central enhet. Varje kamera kommer att ha en algoritm för att övervaka flödet av bilar, som kommer att tillhöra samma process eller program. Men varje kamera, tillsammans med algoritmen den körs på, kan vara en del av en separat tråd., Inte bara det, men även ramarna som läses från kameran och algoritmen som förutspår ramarna kan också vara två separata trådar.
ett annat exempel kan vara ett videospel där processen måste köra uppgifterna parallellt som grafik, användarinteraktion och nätverk (när du spelar multiplayer-spel) eftersom det måste vara lyhörd hela tiden. Och för att uppnå detta måste det använda sig av begreppet multi-threading, där varje tråd skulle vara ansvarig för att köra varje självständig och individuell uppgift.,
en tråd har sitt flöde av utförande, vilket innebär att processen kommer att ha flera saker som händer på en gång.
det är viktigt att notera att varje process har minst en tråd, och det kallas main thread
. Om ditt program inte har någon definierad tråd, så kommer det åtminstone att ha huvudtråden, dvs själva processen.
om du tittar på ovanstående diagram finns det en process som består av huvudtråden bestående av globala variabler och tre olika trådar t1, T2 och t3. Varje tråd har sina lokala variabler och flöde av utförande av kod., Trådarna delar i allmänhet processens resurser, som de resurser som är tillgängliga för huvudtråden kommer också att delas mellan de tre trådarna t1, t2 och t3. Alla trådar kommer att ha tillgång till de globala variablerna samtidigt som de har sina egna lokala variabler.,
det finns olika typer av trådar:
- kärntråd
- Användartråd
- kombination av kärna och användartråd
låt oss nu titta på några av fördelarna med att ha gängning i ditt program:
-
multi-threading tillåter programmet att påskynda utförandet förutsatt att det har flera processorer.
-
det låter dig också utföra andra uppgifter medan I / O-operationerna utförs med hjälp av flera trådar eller till och med huvudtråd tillsammans med en enda tråd., Till exempel kommer hastigheten vid vilken ramarna från kameran läses och härleds av algoritmen att hanteras av olika trådar. Därför behöver algoritmen inte vänta på att ramen ska matas in, och ramläsningsdelen behöver inte vänta på att algoritmutförandet ska slutföras för att kunna läsa nästa ram.
- trådar inom samma process kan dela minnet och resurserna för huvudtråden.,
utmaningar för gängning:
-
Kom ihåg att Python fungerar baserat på CPython-implementeringen, vilket begränsar endast en tråd som ska köras i taget, varför; gängning kanske inte påskyndar alla uppgifter. Och den väsentliga orsaken till detta är Global Interpreter Lock (GIL).
om du vill lära dig om GIL, är du välkommen att kolla in den här handledningen.
-
om du letar efter att påskynda CPU-intensiv uppgift, threading kanske inte den bästa lösningen för dig. I sådana fall anses multibearbetning vara användbar.,
-
för att utföra ett program som består av olika trådar måste det snabbt växla över trådar; därför måste schemaläggning tas hand om i program där du har många trådar.
-
resursdelning kan också vara ett problem eftersom alla trådar delar samma resurser och minne för de globala variablerna. Därför kan operationer som utförs i en tråd orsaka ett minnesfel för en annan tråd, eller den andra tråden kanske inte får minnet att utföra sin uppgift.,
gängning i Python
-
i Python är gängmodulen en inbyggd modul som kallas
threading
och kan importeras direkt. -
eftersom nästan allt i Python representeras som ett objekt är threading också ett objekt i Python. En tråd kan
- hålla data,
- lagras i datastrukturer som ordböcker, listor, uppsättningar, etc.
- kan skickas som en parameter till en funktion.
-
en tråd kan också utföras som en process.,
-
en tråd i Python kan ha olika tillstånd som:
- vänta,
- låst.
låt oss nu lära oss hur du kan implementera gängning i Python.
Trådmodul i Python3
Observera att Python3 är bakåtkompatibel medthread
– modulen, som finns i Python2. 7. I Python3 kan den importeras som_thread
modul. Så, låt oss ta ett exempel och förstå _thread
– modulen.,
import _thread #thread module importedimport time #time module
låt oss definiera en funktion som heterthread_delay
, som kommer att ta två parametrar som en ingång, dvs namnet på tråden och fördröjningen. Inuti den här funktionen kommer du att:
- definiera en räknare med noll,
- då kommer du att slingra runt med ett tag slinga som kommer att köras i tre gånger,
- inuti while loop, du kommer att sätta
time.sleep()
för att lägga till fördröjning, kommer denna fördröjning att vara användbar för att förstå utförandet av tråden., Denna fördröjning kommer att vara i sekunder, - då kommer du att öka din räknare med 1,
- för att se om din trådkörning går smidigt, kommer du att skriva ut namnet på tråden och den tid då tråden exekveras.
def thread_delay(thread_name, delay): count = 0 while count < 3: time.sleep(delay) count += 1 print(thread_name, '-------->', time.time())
nu för att lägga till trådfunktionen på ovanstående funktion eller för att köra ovanstående funktion i tråden, skulle du användastart_new_thread
– metoden, som finns inuti_thread module
.
låt oss se docstring av metodenstart_new_thread
.,
?_thread.start_new_thread
låt oss passera in i funktionenthread_delay
utan parentes och de två argumenten, dvs. trådnamn och fördröjning (för att visualisera trådutförandet eftersom det är mycket snabbt).
_thread.start_new_thread(thread_delay, ('t1', 1))_thread.start_new_thread(thread_delay, ('t2', 3))
från ovanstående utgång kan du se att trådent1
börjar köras först., Under tiden, tråd t2
väntar eftersom det finns en 3-sekunders fördröjning, och så snart denna fördröjning är klar, tråd t2
exekveras, och även fördröjningen för tråd t1
är bara 1 sekund.
låt oss nu ändra fördröjningen av t2
till 5 sekunder, vilket skulle starta t2
efter t1
skulle ha slutat köra eftersom t1
tar bara 3 sekunder att slutföra utförandet.,
_thread.start_new_thread(thread_delay, ('t1', 1))_thread.start_new_thread(thread_delay, ('t2', 5))
implementera gängning med Gängmodulen
låt oss använda samma exempel som du använde ovan, men den här gången använder du modulenthreading
istället för modulen_thread
.
import threadingimport time
def thread_delay(thread_name, delay): count = 0 while count < 3: time.sleep(delay) count += 1 print(thread_name, '-------->', time.time())
inutithreading
– modulen är enThread
– klass, som är en liknande anda somstart_new_thread
– funktionen för _thread
modul.,
låt oss titta på docstring avThread
klass, som tar in flera parametrar som grupp, mål (som en funktion), args, etc.
?threading.Thread
i Trådklasskonstruktören passerar du i målfunktionen thread_delay
och argumenten för den funktionen.,
t1 = threading.Thread(target=thread_delay, args=('t1', 1))t2 = threading.Thread(target=thread_delay, args=('t2', 3))
i gängmodulen, för att köra eller utföra tråden, använder du metoden start()
, som helt enkelt ansvarar för att köra tråden.
?t1.start
t1.start()t2.start()
du kommer också att använda join
– metoden, vilket innebär att vänta tills alla tråd exekver-är klar., Så oavsett kod du har skrivit efterjoin
– metoden kommer endast att utföras när dessa trådar har avslutats.
?t1.join
t1.start()t2.start()t1.join()t2.join()print("Thread execution is complete!")
låt oss nu beräkna volymen kub och kvadrat med gängkonceptet, vilket är ganska rakt framåt.
def volume_cube(a): print ("Volume of Cube:", a*a*a)
def volume_square(a): print ("Volume of Square:", a*a)
t1 = threading.Thread(target=volume_cube, args=(2))t2 = threading.Thread(target=volume_square, args=(3))
t1.start()t2.start()t1.join()t2.join()print("Thread execution is complete!")
vänta; vad? Så snart du utförde startmetoden resulterade det i ett fel., Det beror på att parametern args
förväntar sig en tuple, och eftersom parametern volume_cube
och volume_square
bara förväntar sig en parameter, måste du därför lägga ett kommatecken i parametern args
efter att ha angett det första argumentet för funktionerna.
t1 = threading.Thread(target=volume_cube, args=(2,))t2 = threading.Thread(target=volume_square, args=(3,))
t1.start()t2.start()t1.join()t2.join()print("Thread execution is complete!")
Volume of Cube: 8Volume of Square: 9Thread execution is complete!
låt oss nu lära oss att använda gängning som en underklass.,
gängning som underklass
i det här avsnittet får du lära dig hur du skapar underklass från trådklassen, som är tillgänglig inuti gängmodulen, och sedan skapa trådinstansert1
ocht2
utanför den klassen.
du skulle använda sammathread_delay
funktion här också.
låt oss nu förstå ovanstående kod steg för steg:
-
du definierade en klass som
DataCampThread
, och i klassargumentet passerade du i klassenthreading.Thread
., Anledningen till att du gör det är att du vill skapa en underklass från gängmodulen. Genom att göra detta kan du använda alla metoder som finns tillgängliga i klassenthreading.Thread
som liknar begreppet arv. -
därefter definierade du init-metoden för DataCampThread-klassen och passerade i funktionen tillsammans med fördröjningen. Init är en konstruktör som liknar parametrarna du passerade till klassen
threading.Thread
, här skulle du gå vidare till klassenDataCampThread
., -
då initierar du init-metoden för huvudtrådningen.Tråd klass och sedan likställa namn och fördröjning.
-
därefter definierar du metoden
run
, minns här du definierade metodenstart
, som i princip under huven anropar metodenrun
. Eftersom du har ärvt huvudklassen får du göra ändringar irun
– metoden., Därför, när du ringerstart
– metoden, kommer alla ändringar du kommer att göra irun
– metoden att återspeglas nu.
slutsats
Grattis till att du avslutat handledningen.
denna handledning var en grundläggande introduktion till gängning i python. Threading är dock ett mycket stort och viktigt ämne, och vissa begrepp kan ha lämnats outforskade. Känn dig fri att titta på fler gängmetoder som active count, current threading, etc.
om du vill lära dig mer, Kolla även Pythons Trådbaserade parallellism.,
om du bara kommer igång i Python och vill lära dig mer, ta Datacamps introduktion till datavetenskap i Python-kursen.