多线程Condition版的生戸者与消費者模式

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嶺的生戸看与消轡者模式代咼加下:

原文地址:https://www.cnblogs.com/cyz123/p/10639634.html