Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> Python
Python - Multithreaded Programming
Vorige paginaVolgende pagina

Het uitvoeren van meerdere threads is vergelijkbaar met het gelijktijdig uitvoeren van verschillende programma's, maar met de volgende voordelen −

  • Meerdere threads binnen een proces delen dezelfde gegevensruimte met de hoofdthread en kunnen daarom gemakkelijker informatie delen of met elkaar communiceren dan wanneer het afzonderlijke processen waren.

  • Threads worden soms lichtgewicht processen genoemd en vereisen niet veel geheugenoverhead; ze zijn goedkoper dan processen.

Een thread heeft een begin, een uitvoeringsvolgorde en een conclusie. Het heeft een instructieaanwijzer die bijhoudt waar het in zijn context momenteel wordt uitgevoerd.

  • Het kan vooraf worden geleegd (onderbroken)

  • Het kan tijdelijk in de wacht worden gezet (ook bekend als slapen) terwijl andere threads actief zijn - dit wordt meegevend genoemd.

Een nieuwe thread starten

Om een ​​andere thread te spawnen, moet je de volgende methode aanroepen die beschikbaar is in thread module −

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

Deze methodeaanroep maakt een snelle en efficiënte manier mogelijk om nieuwe threads te maken in zowel Linux als Windows.

De methodeaanroep keert onmiddellijk terug en de onderliggende thread start en roept de functie aan met de doorgegeven lijst van args . Wanneer de functie terugkeert, wordt de thread beëindigd.

Hier, argumenten is een tupel van argumenten; gebruik een lege tuple om de functie aan te roepen zonder argumenten door te geven. kwargs is een optioneel woordenboek van trefwoordargumenten.

Voorbeeld

#!/usr/bin/pythonimport threadimport time# Definieer een functie voor de threaddef print_time( threadName, delay):count =0 while count <5:time.sleep(delay) count +=1 print "%s:%s" % ( threadName, time.ctime(time.time()) )# Maak als volgt twee threads aan probeer:thread.start_new_thread( print_time, ("Thread-1", 2, ) ) thread. start_new_thread( print_time, ("Thread-2", 4, ) )behalve:print "Fout:kan thread niet starten" terwijl 1:pass

Wanneer de bovenstaande code wordt uitgevoerd, levert dit het volgende resultaat op −

Thread-1:do 22 jan 15:42:17 2009Thread-1:do 22 jan 15:42:19 2009Thread-2:do 22 jan 15:42:19 2009Thread-1:do 22 jan 15:42:21 2009Thread-2:do 22 jan 15:42:23 2009Thread-1:do 22 jan 15:42:23 2009Thread-1:do 22 jan 15:42:25 2009Thread-2:do 22 jan 15:42:27 2009Thread-2:do 22 jan 15:42:31 2009Thread-2:do 22 jan 15:42:35 2009

Hoewel het zeer effectief is voor threading op laag niveau, maar de thread module is zeer beperkt in vergelijking met de nieuwere threading-module.

De Threading Module

De nieuwere threading-module die bij Python 2.4 wordt geleverd, biedt veel krachtigere ondersteuning op hoog niveau voor threads dan de thread-module die in de vorige sectie is besproken.

De threading module onthult alle methoden van de thread module en biedt enkele aanvullende methoden −

  • threading.activeCount() − Retourneert het aantal thread-objecten dat actief is.

  • threading.currentThread() − Retourneert het aantal thread-objecten in de thread-besturing van de beller.

  • threading.enumerate() − Retourneert een lijst van alle thread-objecten die momenteel actief zijn.

Naast de methoden heeft de threading-module de Thread klasse die threading implementeert. De methoden die worden geboden door de Thread klasse zijn als volgt −

  • run() − De methode run() is het startpunt voor een thread.

  • start() − De methode start() start een thread door de methode run aan te roepen.

  • doe mee([time]) − De join() wacht op het beëindigen van threads.

  • isAlive() − De methode isAlive() controleert of een thread nog steeds wordt uitgevoerd.

  • getName() − De methode getName() retourneert de naam van een thread.

  • setName() − De setName() methode stelt de naam van een thread in.

Thread maken met Threading Module

Om een ​​nieuwe thread te implementeren met behulp van de threading-module, moet u het volgende doen −

  • Definieer een nieuwe subklasse van de Thread klasse.

  • Overschrijf de __init__(self [,args]) methode om extra argumenten toe te voegen.

  • Overschrijf vervolgens de methode run(self [,args]) om te implementeren wat de thread moet doen wanneer deze wordt gestart.

Nadat u de nieuwe Thread . heeft gemaakt subklasse, kunt u er een instantie van maken en vervolgens een nieuwe thread starten door de start() aan te roepen , die op zijn beurt run() . aanroept methode.

Voorbeeld

#!/usr/bin/pythonimport threadingimport timeexitFlag =0class myThread (threading.Thread):def __init__(self, threadID, name, counter):threading.Thread.__init__(self) self. threadID =threadID self.name =naam self.counter =counter def run(self):print "Starting" + self.name print_time(self.name, 5, self.counter) print "Exiting" + self.namedef print_time(threadName , counter, delay):while counter:if exitFlag:threadName.exit() time.sleep(delay) print "%s:%s" % (threadName, time.ctime(time.time())) counter -=1 # Maak nieuwe threadsthread1 =myThread(1, "Thread-1", 1)thread2 =myThread(2, "Thread-2", 2)# Start nieuwe Threadsthread1.start()thread2.start()print "Hoofdthread afsluiten" 

Wanneer de bovenstaande code wordt uitgevoerd, levert dit het volgende resultaat op −

Thread starten-1Thread starten-2Hoofdthread afsluitenThread-1:do 21 maart 09:10:03 2013Thread-1:do 21 maart 09:10:04 2013Thread-2:do 21 maart 09:10:04 2013Thread-1:do 21 maart 09:10:05 2013Thread-1:do 21 maart 09:10:06 2013Thread-2:do 21 maart 09:10:06 2013Thread-1:do 21 maart 09:10:07 2013Beëindigt Thread-1Thread-2:do 21 maart 09:10:08 2013Thread-2:do 21 maart 09:10:10 2013Thread-2:do 21 maart 09:10:12 2013Beëindigt thread-2

Draden synchroniseren

De threading-module die bij Python wordt geleverd, bevat een eenvoudig te implementeren vergrendelingsmechanisme waarmee u threads kunt synchroniseren. Een nieuw slot wordt gemaakt door de Lock() . aan te roepen methode, die het nieuwe slot retourneert.

De acquire(blocking) methode van het nieuwe lock-object wordt gebruikt om threads te dwingen synchroon te lopen. De optionele blokkering parameter stelt u in staat om te bepalen of de thread wacht om het slot te verkrijgen.

Als blokkeren is ingesteld op 0, keert de thread onmiddellijk terug met een 0-waarde als het slot niet kan worden verkregen en met een 1 als het slot is verkregen. Als blokkeren is ingesteld op 1, blokkeert de draad en wacht tot de vergrendeling wordt vrijgegeven.

De release() methode van het nieuwe vergrendelingsobject wordt gebruikt om de vergrendeling op te heffen wanneer deze niet langer nodig is.

Voorbeeld

#!/usr/bin/pythonimport threadingimport timeclass myThread (threading.Thread):def __init__(self, threadID, name, counter):threading.Thread.__init__(self) self.threadID =threadID self.name =naam self.counter =counter def run(self):print "Starting" + self.name # Vergrendel om threads te synchroniseren threadLock.acquire() print_time(self.name, self.counter, 3) # Gratis lock om volgende thread vrij te geven threadLock.release()def print_time(threadName, delay, counter):while counter:time.sleep(delay) print "%s:%s" % (threadName, time.ctime(time.time() )) counter -=1threadLock =threading.Lock()threads =[]# Maak nieuwe threadsthread1 =myThread(1, "Thread-1", 1)thread2 =myThread(2, "Thread-2", 2)# Begin nieuw Threadsthread1.start()thread2.start()# Voeg threads toe aan threadlijstthreads.append(thread1)threads.append(thread2)# Wacht tot alle threads zijn voltooid voor t in threads:t.join()print "Hoofddraad verlaten"

Wanneer de bovenstaande code wordt uitgevoerd, levert dit het volgende resultaat op −

Thread starten-1Thread starten-2Thread-1:do 21 maart 09:11:28 2013Thread-1:do 21 maart 09:11:29 2013Thread-1:do 21 maart 09:11:30 2013Thread-2:do 21 maart 09:11:32 2013Thread-2:do 21 maart 09:11:34 2013Thread-2:do 21 maart 09:11:36 2013Hoofddraad verlaten

Multithreaded prioriteitswachtrij

De Wachtrij module kunt u een nieuw wachtrij-object maken dat een specifiek aantal items kan bevatten. Er zijn de volgende methoden om de wachtrij te besturen −

  • get() − De get() verwijdert en retourneert een item uit de wachtrij.

  • put() − De put voegt item toe aan een wachtrij.

  • qsize() − De qsize() retourneert het aantal items dat momenteel in de wachtrij staat.

  • leeg() − De lege( ) retourneert True als de wachtrij leeg is; anders niet waar.

  • volledig() − de full() geeft True terug als de wachtrij vol is; anders niet waar.

Voorbeeld

#!/usr/bin/pythonimport Queueimport threadingimport timeexitFlag =0class myThread (threading.Thread):def __init__(self, threadID, name, q):threading.Thread.__init__(self) self .threadID =threadID self.name =naam self.q =q def run(self):print "Starting" + self.name process_data(self.name, self.q) print "Exiting" + self.namedef process_data(threadName, q):while not exitFlag:queueLock.acquire() indien niet workQueue.empty():data =q.get() queueLock.release() print "%s verwerking %s" % (threadName, data) else:queueLock. release() time.sleep(1)threadList =["Thread-1", "Thread-2", "Thread-3"]nameList =["Eén", "Twee", "Drie", "Vier", " Five"]queueLock =threading.Lock()workQueue =Queue.Queue(10)threads =[]threadID =1# Maak nieuwe threads voor tName in threadList:thread =myThread(threadID, tName, workQueue) thread.start() threads. append(thread) threadID +=1# Vul de queuequeueLock.acquire()voor woord in nameList:workQueue.put(word)queueLock.releas e()# Wacht tot de wachtrij leeg is terwijl hij niet werktQueue.empty():pass# Waarschuw threads dat het tijd is om te verlatenexitFlag =1# Wacht tot alle threads zijn voltooid voor t in threads:t.join()print "Hoofddraad verlaten"

Wanneer de bovenstaande code wordt uitgevoerd, levert dit het volgende resultaat op −

Thread starten-1Thread starten-2Thread starten-3Thread-1-verwerking OneThread-2-verwerking TwoThread-3-verwerking ThreeThread-1-verwerking FourThread-2-verwerking FiveExiting Thread-3Thread afsluiten-1 Thread afsluiten-2 Hoofdthread afsluiten 

Python

  • C Taal
  •   
  • VHDL
  •   
  • Verilog
  •   
  • MATLAB
  •   
  • Python
  •   
  • Java
    1. Python vs Go:wat is het verschil?
    2. Python Iterators
    3. Python installeren op Windows [Pycharm IDE]
    4. Python Anonieme/Lambda-functie
    5. Hoe u niet omgaat met uitzonderingen in Python
    6. Python strptime()