Python多執行緒例項
相關文件
執行緒與程序
執行緒是程序內一個執行單元,也是程序內的可排程實體。
執行緒與程序的區別:
- 地址空間,程序獨立空間,執行緒共享程序內的地址空間
- 資源分配,程序是系統資源排程及分派的基本單位
- 執行緒是處理器排程的基本單位
- 二者均可實現併發
多執行緒:
執行緒的劃分小,並行的效率高;
多執行緒共享記憶體單元,極大地提高了程式執行效率
Python執行緒模組
Python3支援執行緒的模組主要有thread和threading兩個模組,thread是比較底層的模組,threading是對thread的一個封裝的模組,threading比較方便以及好用。
Python3.x通過Threading模組建立新的執行緒有兩種方法:
- 通過threading.Thread(target=executable Method),即通過傳遞給Thread物件一個可執行方法或物件;
- 繼承threading.Thread定義子類並重寫run()方法。
第2種方法中,唯一必須重寫的方法是run()
(1) 通過threading.Thread() 進行建立多執行緒,即通過傳遞給thread物件一個可執行的方法(或物件)
import threading
import time
def target():
print (threading.current_thread().name, "1")
time.sleep(2)
print(threading.current_thread().name, "2")
# 當前主執行緒在執行
print(threading.current_thread().name, "3")
# 開啟執行緒t, 一般按順序賦予:Thread-1
t = threading.Thread(target=target)
t.start()
# join()是阻塞當前執行緒,此處的當前執行緒是主執行緒,
# 主執行緒直到Thread-1結束之後才結束, 所以最後結束的是主執行緒
t.join()
print(threading.current_thread().name, "4")
執行結果:
MainThread 3
Thread-1 1
Thread-1 2
MainThread 4
(2) 通過繼承 threading.Thread 定義子類建立多執行緒
使用 threading 模組建立多執行緒,直接從 threading.Thread 繼承,然後重寫__init__() 方法和 run() 方法
import threading
import time
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("開始執行:" + self.name)
print(self.name, self.counter, 5)
print("結束執行:" + self.name)
def print_time(threadName, delay, counter):
while counter:
time.sleep(delay)
print("%s 程序 在:" % (threadName, time.ctime(time.time())))
counter -= 1
#建立新執行緒
thread_1 = MyThread(1, "Thread-1", 1)
thread_2 = MyThread(2, "Thread-2", 2)
#開啟執行緒
thread_1.start()
thread_2.start()
#等待執行緒結束
thread_1.join()
thread_2.join()
執行結果:
開始執行:Thread-1
開始執行:Thread-2
Thread-1 1 5
Thread-2 2 5
結束執行:Thread-1
結束執行:Thread-2
這個結果有一定的變化。可以使用執行緒同步進行控制。
執行緒同步
如果多個執行緒共同對某個資料修改,則可能出現不可預料的結果,為了保證資料的正確性,需要對多個執行緒進行同步。
使用Thread物件的Lock和Rlock可以實現簡單的執行緒同步,這兩個物件都有acquire方法和release方法,對於那些需要每次只允許一個執行緒操作的資料,可以將其操作放到acquire和release方法之間。
需要注意的是,Python有一個GIL(Global Interpreter Lock)機制,任何執行緒在執行之前必須獲取這個全域性鎖才能執行,每當執行完100條位元組碼,全域性鎖才會釋放,切換到其他執行緒執行。
多執行緒實現同步有四種方法:
1、鎖機制
2、訊號量
3、條件判斷
4、同步佇列
1、鎖機制實現示例
threading的Lock類,用該類的 acquire 函式進行加鎖,用 realease 函式進行解鎖
未完待續…