Heim  >  Artikel  >  Backend-Entwicklung  >  Multiprozess- und Multithread-Beispiele in Python (2) Programmiermethoden

Multiprozess- und Multithread-Beispiele in Python (2) Programmiermethoden

零下一度
零下一度Original
2017-06-01 10:01:101726Durchsuche

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.

1. Threading

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.

2. Sperren

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?

4.

Detaillierte Einführung in Python-Prozesse, Threads und Coroutinen

5.

Python-Concurrent-Programming-Thread-Pool/Prozess-Pool

Das 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn