Das beste Python Multithreaded-Tutorial im Jahr 2024. In diesem Tutorial können Sie Starten Sie das Lernen Python-Threads,Threading-Modul,Verwenden Sie Threading-Modul Threads zu erstellen,Themen-Synchronisation,Thread-Priorität-Warteschlange (Queue), lernen
Mehrere Threads ausgeführt gleichzeitig ist ähnlich zu einer Anzahl von verschiedenen Programmen, multithreaded Betrieb hat die folgenden Vorteile:
Themen in den Umsetzungsprozess und der Prozess ist anders. Jedes verfügt über einen separaten Thread ausgeführt Eingang, Ausgang Folge und Verfahren für die Durchführung des Auftrages. Aber der Faden ist unabhängig auszuführen nicht in der Lage, es muss entsprechend existieren an die Anwendung, mehrere Ausführungs-Threads Bereitstellung durch die Anwendung gesteuert.
Jeder Thread hat seinen eigenen Satz von CPU-Register, genannt spiegelt der Kontext des Themas, der Thread-Kontext den letzten Lauf des Threads CPU-Register-Zustand.
Befehlszeiger und Stapelzeigerregister sind die beiden wichtigsten Thread-Kontext-Register, der Faden immer in Zusammenhang mit dem Prozess ausgeführt wird, werden diese Adressen verwendet, um den Prozeß zu kennzeichnen, die den Faden von dem Speicheradressenraum besitzt.
Python-Threads auf zwei Arten verwendet: mit einer Funktion oder Klasse, um die Thread-Objekt zu wickeln.
Funktional: Aufruf Thread Modul start_new_thread () Funktion einen neuen Thread zu erzeugen. Die Syntax lautet wie folgt:
thread.start_new_thread ( function, args[, kwargs] )
Parameter Beschreibung:
Beispiel:
#!/usr/bin/python # -*- coding: UTF-8 -*- import thread import time # 为线程定义一个函数 def print_time( threadName, delay): count = 0 while count < 5: time.sleep(delay) count += 1 print "%s: %s" % ( threadName, time.ctime(time.time()) ) # 创建两个线程 try: thread.start_new_thread( print_time, ("Thread-1", 2, ) ) thread.start_new_thread( print_time, ("Thread-2", 4, ) ) except: print "Error: unable to start thread" while 1: pass
Die oben genannten Programmausgabe Ergebnisse sind wie folgt:
Thread-1: Thu Jan 22 15:42:17 2009 Thread-1: Thu Jan 22 15:42:19 2009 Thread-2: Thu Jan 22 15:42:19 2009 Thread-1: Thu Jan 22 15:42:21 2009 Thread-2: Thu Jan 22 15:42:23 2009 Thread-1: Thu Jan 22 15:42:23 2009 Thread-1: Thu Jan 22 15:42:25 2009 Thread-2: Thu Jan 22 15:42:27 2009 Thread-2: Thu Jan 22 15:42:31 2009 Thread-2: Thu Jan 22 15:42:35 2009
Das Ende des Fadens ist beruhen im allgemeinen auf dem natürlichen Ende der Funktionsfaden, auch thread.exit Thread-Funktion () aufrufen können, er wirft Systemexit Ausnahme, erreichen den Zweck Faden zu verlassen.
Python bietet Unterstützung für Faden durch zwei Standardbibliotheken Einfädeln und Gewinden. Gewinde bietet eine Low-Level, das ursprüngliche Gewinde und eine einfache Sperre.
Andere Methoden Gewinde-Modul bietet:
Neben der Verwendung von Methoden, threading-Modul bietet auch eine Thread-Klasse den Faden, Thread-Klasse stellt die folgenden Methoden zu behandeln:
Verwenden Sie Threading-Modul einen Thread zu erstellen, direkt von threading.Thread geerbt, dann außer Kraft setzen __init__ Methode und führen Methoden:
#!/usr/bin/python # -*- coding: UTF-8 -*- import threading import time exitFlag = 0 class myThread (threading.Thread): #继承父类threading.Thread def __init__(self, threadID, name, counter): threading.Thread.__init__(self) self.threadID = threadID self.name = name self.counter = counter def run(self): #把要执行的代码写到run函数里面 线程在创建后会直接运行run函数 print "Starting " + self.name print_time(self.name, self.counter, 5) print "Exiting " + self.name def print_time(threadName, delay, counter): while counter: if exitFlag: thread.exit() time.sleep(delay) print "%s: %s" % (threadName, time.ctime(time.time())) counter -= 1 # 创建新线程 thread1 = myThread(1, "Thread-1", 1) thread2 = myThread(2, "Thread-2", 2) # 开启线程 thread1.start() thread2.start() print "Exiting Main Thread"
Die oben genannten Programmausführung Ergebnisse sind wie folgt;
Starting Thread-1 Starting Thread-2 Exiting Main Thread Thread-1: Thu Mar 21 09:10:03 2013 Thread-1: Thu Mar 21 09:10:04 2013 Thread-2: Thu Mar 21 09:10:04 2013 Thread-1: Thu Mar 21 09:10:05 2013 Thread-1: Thu Mar 21 09:10:06 2013 Thread-2: Thu Mar 21 09:10:06 2013 Thread-1: Thu Mar 21 09:10:07 2013 Exiting Thread-1 Thread-2: Thu Mar 21 09:10:08 2013 Thread-2: Thu Mar 21 09:10:10 2013 Thread-2: Thu Mar 21 09:10:12 2013 Exiting Thread-2
Wenn mehrere Threads einer gemeinsamen Datenänderung kann unvorhersagbare Ergebnisse auftreten, um die Richtigkeit der Daten zu gewährleisten, müssen wir mehrere Threads zu synchronisieren.
Thread-Objekt mit dem Schloss und RLOCK können eine einfache Thread-Synchronisation zu erreichen, die beiden Objekte haben Methoden erwerben und Freisetzung Methoden, für diejenigen, die jeweils so dass nur ein Thread Betriebsdaten benötigen, kann sie in Betrieb acquire platziert werden und lassen Sie Methoden der Zimmer. Wie folgt:
Multithreading Vorteil ist, dass es mehrere Aufgaben gleichzeitig ausgeführt werden können (zumindest fühlt sich an wie diese). Aber wenn Threads benötigen, um Daten zu teilen, kann es keine Daten-Synchronisierungsprobleme sein.
Betrachten wir einen Fall: eine Liste aller Elemente Null sind, der Thread "set" von hinten nach vorne alle Elemente in einem, und der Faden "Drucken" von vorne in Ladung Rückseite der Liste und drucken zu lesen.
Dann kann der Faden "gesetzt" werden, begann sich zu ändern, wenn der Thread "Drucken" eine Liste zu drucken, wäre es eine 0 Hälfte der Ausgang der Hälfte sein, die die Daten nicht synchronisiert ist. Um diese Situation zu vermeiden, führen wir das Konzept des Schlosses.
Sperre hat zwei Zustände - verriegelt und entriegelt. Jedes Mal, wenn ein Thread wie "set" die gemeinsamen Daten zugreifen zu können, müssen Sie zuerst die Sperre erhalten, wenn Sie bereits ein anderes Gewinde haben, wie zum Beispiel "Drucken" zu erhalten eingesperrt, dann lassen Sie den Faden "set" Pause, die synchrone Sperrung ist, bis der Faden warten " drucken "Zugriff abgeschlossen ist, nach der Freigabe des Schlosses, lassen Sie den Faden" Set ", um fortzufahren.
Nach diesem Prozess, wenn Sie eine Liste aller Ausgaben entweder 0 oder 1 volle Leistung zu drucken, wird nicht mehr die Hälfte Verlegenheit 0 1 halb.
Beispiel:
#!/usr/bin/python # -*- coding: UTF-8 -*- import threading import time class myThread (threading.Thread): def __init__(self, threadID, name, counter): threading.Thread.__init__(self) self.threadID = threadID self.name = name self.counter = counter def run(self): print "Starting " + self.name # 获得锁,成功获得锁定后返回True # 可选的timeout参数不填时将一直阻塞直到获得锁定 # 否则超时后将返回False threadLock.acquire() print_time(self.name, self.counter, 3) # 释放锁 threadLock.release() def print_time(threadName, delay, counter): while counter: time.sleep(delay) print "%s: %s" % (threadName, time.ctime(time.time())) counter -= 1 threadLock = threading.Lock() threads = [] # 创建新线程 thread1 = myThread(1, "Thread-1", 1) thread2 = myThread(2, "Thread-2", 2) # 开启新线程 thread1.start() thread2.start() # 添加线程到线程列表 threads.append(thread1) threads.append(thread2) # 等待所有线程完成 for t in threads: t.join() print "Exiting Main Thread"
Pythons Queue-Modul ermöglicht die Synchronisierung, Thread-sichere Warteschlange Klassen, einschließlich FIFO (first in first out) Warteschlange Queue, LIFO (last in, first out) Warteschlange LifoQueue und Prioritätswarteschlange Priorityqueue. Diese Warteschlangen sind implementiert Verriegelungs Primitiven direkt in mehrere Threads verwendet werden können. Sie können die Warteschlange verwenden Synchronisation zwischen Threads zu erreichen.
Queue-Modul häufigsten verwendeten Methoden:
Beispiel:
#!/usr/bin/python # -*- coding: UTF-8 -*- import Queue import threading import time exitFlag = 0 class myThread (threading.Thread): def __init__(self, threadID, name, q): threading.Thread.__init__(self) self.threadID = threadID self.name = name self.q = q def run(self): print "Starting " + self.name process_data(self.name, self.q) print "Exiting " + self.name def process_data(threadName, q): while not exitFlag: queueLock.acquire() if not workQueue.empty(): data = q.get() queueLock.release() print "%s processing %s" % (threadName, data) else: queueLock.release() time.sleep(1) threadList = ["Thread-1", "Thread-2", "Thread-3"] nameList = ["One", "Two", "Three", "Four", "Five"] queueLock = threading.Lock() workQueue = Queue.Queue(10) threads = [] threadID = 1 # 创建新线程 for tName in threadList: thread = myThread(threadID, tName, workQueue) thread.start() threads.append(thread) threadID += 1 # 填充队列 queueLock.acquire() for word in nameList: workQueue.put(word) queueLock.release() # 等待队列清空 while not workQueue.empty(): pass # 通知线程是时候退出 exitFlag = 1 # 等待所有线程完成 for t in threads: t.join() print "Exiting Main Thread"
Die Ergebnisse des obigen Programms:
Starting Thread-1 Starting Thread-2 Starting Thread-3 Thread-1 processing One Thread-2 processing Two Thread-3 processing Three Thread-1 processing Four Thread-2 processing Five Exiting Thread-3 Exiting Thread-1 Exiting Thread-2 Exiting Main Thread