Im vorherigen Kapitel haben wir einige grundlegende Methoden der Python-Multiprozessprogrammierung kennengelernt: Verwendung der Klassen Process, Pool, Queue, Lock, Pipe und anderer Klassen, die vom plattformübergreifenden Multiprozessmodul Multiprocessing bereitgestellt werden, um Unterprozesse zu implementieren Erstellung, Prozesspool (Batch) Untergeordnete Prozesse erstellen und die maximale Anzahl untergeordneter Prozesse verwalten) und Kommunikation zwischen Prozessen. In diesem Kapitel erfahren Sie mehr über Multithread-Programmiermethoden in Python.
Thread ist die kleinste Einheit für das Betriebssystem, um Aufgaben auszuführen. Das Threading-Modul wird in der Python-Standardbibliothek bereitgestellt, die eine sehr praktische Unterstützung für die Multithread-Programmierung bietet.
Das Folgende ist der Code zum Implementieren von Multithreading mithilfe von Threading:
1 #!/usr/bin/python 2 # -*- coding: utf-8 -* 3 author = 'zni.feng' 4 import sys 5 reload (sys) 6 sys.setdefaultencoding('utf-8') 7 8 import threading, time 9 10 def test(index):11 print time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))12 print 'thread %s starts.' % threading.current_thread().name13 print 'the index is %d' % index14 time.sleep(3)15 print time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))16 print 'thread %s ends.' % threading.current_thread().name17 18 if name == "main":19 print time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))20 print 'thread %s starts.' % threading.current_thread().name21 #创建线程22 my_thread = threading.Thread(target = test, args=(1,) , name= 'zni_feng_thread')23 #等待2s24 time.sleep(2)25 #启动线程26 my_thread.start()27 #等待线程结束28 my_thread.join()29 print time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))30 print 'thread %s ends.' % threading.current_thread().name
Das Ausgabeergebnis ist:
2017-01-12 22:06:32 thread MainThread starts. 2017-01-12 22:06:34 thread zni_feng_thread starts. the index is 1 2017-01-12 22:06:37 thread zni_feng_thread ends. 2017-01-12 22:06:37 thread MainThread ends. [Finished in 5.1s]
Darunter der current_thread() Funktion des Threading-Moduls gibt die Instanz des aktuellen Threads zurück.
Der größte Unterschied zwischen Multiprozess und Multithread besteht darin, dass in jedem Prozess dieselbe Variable vorhanden ist sich nicht gegenseitig beeinflussen. Beim Multithreading werden alle Variablen von allen Threads gemeinsam genutzt, sodass jede gemeinsam genutzte Variable von jedem Thread geändert werden kann. Daher besteht die größte Gefahr beim Datenaustausch zwischen Threads darin, dass mehrere Threads gleichzeitig eine Variable ändern. Um dieses Problem zu lösen, können wir die Lock-Klasse des Threading-Moduls verwenden, um die gemeinsam genutzten Variablen zu sperren.
Sehen wir uns zunächst ein Beispiel für die Verwendung mehrerer Threads an, um dieselbe gemeinsam genutzte Variable ohne Sperre zu schreiben:
1 #!/usr/bin/python 2 # -*- coding: utf-8 -* 3 author = 'zni.feng' 4 import sys 5 reload (sys) 6 sys.setdefaultencoding('utf-8') 7 import threading 8 9 class Account:10 def init(self):11 self.balance = 012 13 def add(self):14 for i in range(0,100000):15 self.balance += 116 17 def delete(self):18 for i in range(0,100000):19 self.balance -=1 20 21 if name == "main":22 account = Account()23 #创建线程24 thread_add = threading.Thread(target=account.add, name= 'Add')25 thread_delete = threading.Thread(target=account.delete, name= 'Delete')26 27 #启动线程28 thread_add.start()29 thread_delete.start()30 31 #等待线程结束32 thread_add.join()33 thread_delete.join()34 35 print 'The final balance is: ' + str(account.balance)
Das laufende Ergebnis ist:
The final balance is: -51713 [Finished in 0.1s]
Das ist möglich Es kann festgestellt werden, dass jedes Mal, wenn es ausgeführt wird, das Endergebnis unterschiedlich ist und nicht 0 ist. Dies liegt daran, dass Konflikte auftreten, wenn verschiedene Threads gleichzeitig dieselbe Variable ändern und einige Zwischenvariablen nicht der Reihe nach verwendet werden.
Jetzt verwenden wir Lock, um das Programm zu sperren:
1 #!/usr/bin/python 2 # -*- coding: utf-8 -* 3 author = 'zni.feng' 4 import sys 5 reload (sys) 6 sys.setdefaultencoding('utf-8') 7 import threading 8 9 class Account:10 def init(self):11 self.balance = 012 13 def add(self, lock):14 #获得锁15 lock.acquire()16 for i in range(0,100000):17 self.balance += 118 #释放锁19 lock.release()20 21 def delete(self, lock):22 #获得锁23 lock.acquire()24 for i in range(0,100000):25 self.balance -=1 26 #释放锁27 lock.release()28 29 30 if name == "main":31 account = Account()32 lock = threading.Lock()33 #创建线程34 thread_add = threading.Thread(target=account.add, args=(lock, ), name= 'Add')35 thread_delete = threading.Thread(target=account.delete, args=(lock, ), name= 'Delete')36 37 #启动线程38 thread_add.start()39 thread_delete.start()40 41 #等待线程结束42 thread_add.join()43 thread_delete.join()44 45 print 'The final balance is: ' + str(account.balance)
Es kann festgestellt werden, dass das Bilanzergebnis unabhängig von der Häufigkeit der Ausführung 0 ist. Wenn Sie die Ergebnisse jeder Saldenberechnung ausdrucken, werden Sie auch feststellen, dass, wenn ein Thread mit der Ausführung beginnt, der andere Thread vor dem Start wartet, bis die Ausführung des vorherigen Threads abgeschlossen ist (um genau zu sein, lock.release() hat die Ausführung abgeschlossen). . umsetzen.
The final balance is: 0 [Finished in 0.1s]
[Verwandte Empfehlungen]
1.Beispiele für Multiprozess und Multithreading in Python (1)
2 🎜>Python Wird empfohlen, Multi-Processing anstelle von Multi-Threading zu verwenden? Teilen Sie die Gründe mit, warum die Verwendung von Multiprozessen empfohlen wird
3. Ist Multiprozess oder Multithread in Python schneller? Detaillierte Einführung in Python-Prozesse, Threads und CoroutinenPython-Concurrent-Programming-Thread-Pool/Prozess-PoolDas obige ist der detaillierte Inhalt vonMultiprozess- und Multithread-Beispiele in Python (2) Programmiermethoden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!