import threading
import time
# python 實現執行緒同步:event、(r)lock、semaphore、barricade、condition
# event 使用:e.set() e.clear() e.is_set() e.wait()
def event_usage(): # 主要就set設定event為true,clear變false,wait 用於等待true,is_set來判斷是否為true
l =
e = threading.event()
def pro():
while true:
print('adding ', l)
time.sleep(1)
if len(l) == 5:
print(l)
e.set() # set之後event 為true,可以讓另乙個執行緒使用
def con():
while true:
e.wait() # 先等待event 變成true
print('grab all ~~')
l.clear()
e.clear() # 完成之後用clear再把event 變成false ,繼續等待adding
p = threading.thread(target=pro)
c = threading.thread(target=con)
p.start()
c.start()
# lock的使用: acquire 預設blocking=true,timeout=-1 上鎖,不能用 。 使用release 釋放就能使用
# 注意 ,加鎖就要解鎖,但是有些程式中斷導致沒有解鎖,因此最好使用try finally的語句保證 解鎖,避免死鎖
# rlock 可重入鎖,在同一執行緒內可以反覆獲得鎖,其他執行緒想使用會阻塞。 釋放鎖的時候要做相應多次的release別的執行緒才能使用。
def lock_usage():
l =
lock = threading.lock()
def one():
while true:
time.sleep(1)
lock.acquire()
print('adding completed,release')
lock.release()
def two():
while true:
time.sleep(0.1)
if len(l) % 6 == 0:
lock.acquire()
print('time to sleep 5secs')
time.sleep(5)
lock.release()
t1 = threading.thread(target=one)
t2 = threading.thread(target=one)
t3 = threading.thread(target=two)
t1.start()
t2.start()
t3.start()
# condition wait 等待通知, notifyall 通知所有等待的執行緒
class cond:
def __init__(self):
self.l =
self.cond = threading.condition()
def pro(self):
with self.cond:
print('wait 3 s')
time.sleep(3)
self.cond.notify_all()
time.sleep(3)
print('t1 done')
def con(self):
with self.cond:
self.cond.wait()
print('go go go')
time.sleep(1)
print('t2 done')
def start(self):
t1 = threading.thread(target=self.pro)
t2 = threading.thread(target=self.con)
t2.start() # 必須t2先開始 ,with 獲得鎖,然後wait 解開鎖並加入等待池,然後t1的with 再獲得鎖,直到notifyall t2繼續執行,
t1.start()
# barrier : barrier(3#等幾個執行緒就打破屏障) wait(執行緒等待屏障打破) : 所有執行緒等待barrier打破 。 abort()打破屏障,等待中的執行緒會拋broken異常 。reset()重設屏障
def barrier_usage():
b = threading.barrier(2) # 等待執行緒達到兩個就打破barrier
def p():
b.wait()
print('gogogo')
t1 = threading.thread(target=p)
t2 = threading.thread(target=p)
t1.start()
t2.start()
# semaphore 用法和lock類似,但是acquire 計數-1 ,release計數+1,計數為0 時候就阻塞執行緒,負數時候報錯,
def semaphore_usage():
t = threading.semaphore()
def a():
t.acquire()
print('111')
def b():
t.acquire() # 執行後 計數為0 ,別的執行緒被阻塞
print('222')
time.sleep(1)
t.release() # 計數回正後 不再阻塞可以列印a
t1 = threading.thread(target=a)
t2 = threading.thread(target=b)
t2.start()
t1.start()
semaphore_usage()
Python多執行緒同步
1 實現檔案讀寫的檔案ltz schedule times.py usr bin env python coding utf 8 import os def readtimes res if os.path.exists schedule times.txt fp open schedule tim...
同步,多執行緒 ,多執行緒方式實現併發。
io請求幾乎不佔cpu的。同步請求相當於排隊買東西,乙個卡主了,其他的都結不了賬了。執行緒並不是越多越好,如果他特別多還不如同步高,所以對執行緒要有個限制,所以就出現了執行緒池,執行緒池在python3裡才有的,python2裡沒有的。建立程序的話是耗費很多資源的,建立執行緒是幾乎不耗費資源的。建立...
python 多執行緒5執行緒同步
互斥鎖是最簡單的執行緒同步機制,python提供的condition物件提供了對複雜執行緒同步問題的支援。condition被稱為條件變數,除了提供與lock類似的acquire和release方法外,還提供了wait和notify方法。執行緒首先acquire乙個條件變數,然後判斷一些條件。如果條...