執行緒間的通訊在多執行緒程式設計過程中難以避免,常見的執行緒間通訊方式有兩種:
共享變數
通過訊息佇列queue實現
1. 共享變數
目前接觸的問題來看,適應於解釋多執行緒程式設計過程中乙個典型例項
nums =
0def
insertnums()
:global nums
for i in
range
(10000000):
nums +=
1def
deletenums()
:global nums
for j in
range
(10000000):
nums -=
1import threading
t1 = threading.thread(target=insertnums)
t2 = threading.thread(target=deletenums)
t1.start(
)t2.start(
)t1.join(
)t2.join(
)
上述例項中insertnums函式以及deletenum函式共享了全域性變數nums分別執行+操作以及-操作,但是執行後得到的結果並非預期的nums = 0
所以這個**例項很好的暴露出了多執行緒執行緒間通訊存在的問題即執行緒不安全目前解決執行緒不安全的方法就是加鎖
import threading
locker = threading.lock(
)nums = 0
def insertnums():
global nums
global locker
for i in range(10000000)
: locker.acquire(
) nums += 1
locker.release(
)def deletenums():
global nums
global locker
for j in range(10000000)
: locker.acquire(
) nums -= 1
locker.release(
)
2. 訊息佇列
queue中提供了執行緒之間的通訊機制,能夠保證執行緒的安全
from time
import
sleep
import threading
from queue import queue
def writeq(queue):
for i in range(100):
tmp = queue.get(true)
queue.put(tmp + 1, true)
def readq(queue):
for i in range(100):
tmp = queue.get(true)
queue.put(tmp + 1, true)
def main(
): q = queue(32)
q.put(0, true)
threading.thread(target=writeq, args =
(q,)).start(
) threading.thread(target=readq, args =
(q,)).start(
) sleep(2)
print q.get(true)
if __name__ ==
'__main__'
: main(
)
python高階 多執行緒
1.1 獲取執行緒數 import threading import time def fun time.sleep 1 print hello t threading.thread target fun t.start print threading.enumerate while true le...
Python高階(多執行緒)
多執行緒結構 import threading def worker 子執行緒要執行的具體邏輯 函式 print threading t1 threading.current thread time.sleep 9 通過休眠模擬子執行緒非同步邏輯 print t1.getname new t thr...
Python高階 多執行緒 05 執行緒
併發 時間段內多個程式輪流執行 並行 同乙個時刻不同cpu同時執行 執行緒 程式執行中,執行 的乙個分支。每個執行至少都有乙個執行緒.執行緒是作業系統排程資源的基礎單位 1.建立 import threading 方法 thread group 執行緒組,目前只能使用none target 執行的目...