python中多執行緒同步實現

2021-09-10 01:35:39 字數 3103 閱讀 9414

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乙個條件變數,然後判斷一些條件。如果條...