生产者和消费者模式

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之崩调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值