python多线程----生产者消费者模式

Lock版本:

#其实生产者和消费者都是要修改公共资源的
#但是消费者,要在生产者修改过公共资源后,才能处理公共资源,
#生产者生产后,就等着消费者处理完,生产者再修改数据.

import threading
import random
import time


gMoney=0
gLock=threading.Lock()

def producer():
    global gMoney
    while True:
        money=random.randint(100,1000)
        gLock.acquire()
        gMoney+=money
        print("%s生产了%d,现在共有%d元钱"%(threading.current_thread(),money,gMoney))
        gLock.release()
        time.sleep(2)

def consumer():
    global gMoney
    while True:
        money=random.randint(100,1000)
        gLock.acquire()
        if money<gMoney:
            gMoney-=money
            print("%s消费了%d,剩下%d元钱" % (threading.current_thread(), money, gMoney))
        gLock.release()
        time.sleep(1)

def main():
    for i in range(5):
        t=threading.Thread(target=producer)
        t.start()

    for x in range(5):
        t=threading.Thread(target=consumer)
        t.start()

if __name__ == '__main__':
    main()

Condition版本:

#Lock版本中上锁,放锁比较费时间
#在本版本种中如果不满足生产条件,处于阻塞状态
#wait:将当前线程处于阻塞状态,并且释放锁
#notify:默认唤醒第一个正在等待的线程,不会立刻释放锁
#notify_all:唤醒所有等待的线程,不会释放锁,和notify都要放在releas函数前面
'''关于等待唤醒机制,可以理解为线程可以执行有两个条件:
有争取执行权的资格 and 争取到执行权,'
一个没有争取执行权资格的线程 不能 争取执行权.
wait就是让本线程放弃争取的资格,如果有锁就释放掉,
notify就是重新给该线程争取的资格'''



import threading
import random
import time


gMoney=0
gCondition=threading.Condition()

def producer():
    global gMoney
    while True:
        money=random.randint(100,1000)
        gCondition.acquire()
        gMoney+=money
        print("%s生产了%d,现在共有%d元钱"%(threading.current_thread(),money,gMoney))
        gCondition.notify_all()
        gCondition.release()
        time.sleep(2)

def consumer():
    global gMoney
    while True:
        money=random.randint(100,1000)
        gCondition.acquire()
        while money>gMoney:
            gCondition.wait()
        gMoney-=money
        print("%s消费了%d,剩下%d元钱" % (threading.current_thread(), money, gMoney))
        gCondition.release()
        time.sleep(1)

def main():
    for i in range(5):
        t=threading.Thread(target=producer)
        t.start()

    for x in range(5):
        t=threading.Thread(target=consumer)
        t.start()

if __name__ == '__main__':
    main()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值