Lock版本生产者和消费者模式
生产者和消费者模式是多线程开发中经常见到的一种模式。生产者的线程专门用来生产一些数据,然后存放到一个中间的变量中。消
费者再从这个中间的变量中取出数据进行消费。但是因为要使用中间娈量,中间变量经常是一些全局变量,因此需要使用锁来保证数
据完整性。以下是使用 threading.Lock锁实现的"生产者与消费者模式"的一个例子
import threading
import random
import time
gMoney = 1000
gLock = threading.Lock()
#记录生产者生产的次数,达到10次不再生产
gRimes= 0
class Producer(threading.Thread):
def run(self):
global mOney
global gLock
global gTimes
while True:
money = random.randint(100, 1000)
gLock.acquire()
# 如果已经达到10次,就不再生产了
if gTimes>=10:
gLock.release()
break
gMoney += money
print('%s当前存入%s元钱,剩余%s元钱', (threading.current_thread(),money,gMoney))
gTimes += 1
time.sleep(0.5)
gLock.release()
Condition版的生产者与消费者模式
Lock版本的生产者与消贵者模式可以正常的运行。但是存在一个不足,在消盘者中,总是通过while true死循环并且上锁的方式去判断钱够不够。上是一个很耗CPU资源的行为。因此这种方式不是最好的,还有一种更好的方式便是使
用 threading.Condition来实现, threading. Condition可以在没有数据的时候处于阻塞等待状态。一旦有合适的数据了,还可以使
用notify相关的函数来通知其他处于等待状态的程。这祥就可以不用做一些无用的上和解锁的操作可以提高程序的性能,首先对 threading.Condition相关的函数做介绍, threading.Condition类似threading.Lock,可以在修改全局数据的时候进行上锁,也可以在修改完毕后进行解。以下将一些常用的数做个简单的介绍:
1.acquire:上锁
2.re1ease:解锁。
3.wait:将当前共程处于等持状态,并且会释放锁。可以被其他程使用notify和notify_all图,被唤醒后会继续等待上锁,上锁后继续执行下面的代码。
4. notify:通知某个正在等待线程,默认是第1个等待的线程
5. notify_a11:通知所有正在等待的共程。 notify和 notify_a11不会放锁。并且需要在 release之崩调用