多執行緒Condition版的生戸者與消費者模式

2022-08-18 02:51:15 字數 2916 閱讀 9526

lock版本的生產者與消費者模式可以正常的進行。但是存在一乙個不足,在消費者中,總是通過while true 死迴圈並且上鎖的方式去判斷錢夠不夠,上鎖是一種很耗費cpu的行為,.因此這種方式不是最好的.還有一種更好的方式便是使

用threading.condition 來實現。· threading.conditton 可以在沒有資料的吋候處於阻塞等待狀態。一旦有合適的資料了,還可以使用notity相關的函式來通知其他處於等待狀態的執行緒。這樣就可以不用做一些無用的上鎖和解鎖的操作,可以提高程式的效能。

首先対tmrecing.condition相美的注動霰個か紹,threading.condition類似於threading.lock ,可以在修改全域性資料的吋候進行上鎖,也可以在修改完畢後進行解鎖。以下將一-些常用的函式進行筒単的介紹:

1. acquire:上鎖。

2. release :解鎖。

3. wait :將當前執行緒處於等待狀態,並且會釋放鎖。可以接其他執行緒使用notify和notify_all函式喚醒,被喚醒後會繼續等待上鎖,上鎖後會繼續執行 下面的**

4. notify : 通知某個正在等待的執行緒,預設是第乙個等待的執行緒。

5. notify_all :通知所有正在等待的執行緒。

注意:notify和notify_all不會釋放鎖,並且需要在release之前使用。

示例**如下:

#encoding: utf-8

import threading

import random

import

time

gmoney = 1000

gcondition = threading.condition()

gtotaltimes = 10

gtimes = 0

class producer(threading.thread):

def run(self):

global gmoney

global gtimes

while true:

money = random.randint(100,1000)

gcondition.acquire()

if gtimes > 10:

gcondition.release()

break

gmoney += money

print('%s

生產了%d

元錢,剩餘

%d元錢

'%(threading.current_thread(),money,gmoney))

gtimes += 1

gcondition.notify_all()

gcondition.release()

time.sleep(0.5)

class consumer(threading.thread):

def run(self):

global gmoney

while true:

money = random.randint(100,1000)

gcondition.acquire()

while gmoney < money:

if gtimes >=gtotaltimes:

gcondition.release()

return

print('%s

準備消費

%d元錢,剩餘

%d元錢,餘額不足

!' %(threading.current_thread(),money,gmoney))

gcondition.wait()

gmoney -= money

print('%s

消費了%d

元錢,剩餘

%d元錢

' % (threading.current_thread(),money,gmoney),)

gcondition.release()

time.sleep(0.5)

def main():

for x in

range(3):

t = consumer(name='

消費者執行緒

%d'%x)

t.start()

for x in

range(5):

t = producer(name='

生產者執行緒

%d'%x)

t.start()

if __name__ == '__main__':

main()

condition版的生戸者與消費者模式:

tock版本的生戸者與淆酉者襖式可以正常的遙行。但是存在一乙個不足,在消穂者中,怠是通せwtle true 死循粁井且上輌的方式去刔斷軼不躬·上靤崖乙個很耗薺cpu斉源的行カ.因此泣狆方式不是最好的.迂有一狆更好的方式便是使

用threoing.cendition 來女親· threaing.conditton 可以在沒有資料的吋候阯於阻墓等待狀志。一旦有含遁的數握了,逐可以使用notity相美的鑼戱來通丸其他処於等恃侍狀志的も程。迄拝孰可い不用飮一些無用的上鈍和解御的操作。可以摧高程式的效能。首先対tmrecing.condition相美的注動霰個か紹,tnresding.coneito 霙儀threding.cock ,可以在修改全域性數掘的吋候迸行、上蜻,也可以在慘改亢柴後迸行解情。以下將一-些常用的匠針徹個筒単的介紹:1 acqutre s上饋。2 release t解鎖。

a. wait持當荊扶程妣於等待狀傑, 並且會釋旅餉。可ソ樓其他扶程使用notify和notify_oll 伺徴喚酲·被嚀醒後會紲燒等待上領,上輌後継與拉行下薗的代烏。

4 notify :知某↑正在等待的扶橿.默以是篳i↑等待的桟程。

s notify_o t通知所有正在等待的注程· netify 和notify_o1l 不會釋欣飮。並且需愛在retiease之前墹用·condition嶺的生戸看與消轡者模式代咼加下:

Java多執行緒應用 condition的使用

它沒有明確指定喚醒那條執行緒。下面是乙個例項 同起三條執行緒,分別執行private aaa a new aaa 物件的三個方法,讓三個方法按指定的順序列印輸入,先是ooo方法迴圈3次,接著nnn方法迴圈5次,接著mmm方法迴圈7次,這樣依次執行迴圈10次 classname conditionte...

Java多執行緒學習 Condition的使用

condition將object監視器方法 wait notify和notifyall 分解成截然不同的物件,以便通過將這些物件與任意lock實現組合使用,為每個物件提供多個等待 set wait set 其中,lock替代了synchronized方法和語句的使用,condition替代了 obj...

Lock和Condition實現多執行緒迴圈執行

我們可能有如下使用場景 a b c三個執行緒,業務需要a執行5遍,然後b執行10遍,然後c執行15遍,如此迴圈 這時候我們可以考慮用到lock的condition機制 public class locktest for int i 0 i 5 i number 2 c2.signal lock.un...