码迷,mamicode.com
首页 > 其他好文 > 详细

Lock版本生产者和消费者模式

时间:2020-06-21 11:36:18      阅读:44      评论:0      收藏:0      [点我收藏+]

标签:print   大于   次数   __name__   消费者模式   while   全局   随机   lock   

生产者的线程专门用来生产一些数据,存放到一个中间变量中。消费者再从这个中间的变量中取出数据进行消费。但是因为要使用中间变量,中间变量通常是一些全局变量,因此需要使用锁来保证数据完整性。

import random
import threading

gMoney = 1000
gTimes = 0
gAllTimes = 10
gLock = threading.Lock()

class Producer(threading.Thread):
    def run(self):
        global gMoney
        global gTimes
        while True:
            money = random.randint(100,1000)  # 随机生成100-1000的数字
            gLock.acquire()
            if gTimes >= gAllTimes:  # 限制生产者只能生产10次
                gLock.release()   # 满足条件,释放锁
                break
            gMoney += money
            gTimes += 1           # 生产次数+1
            gLock.release()
            print({0}生产者生产了{1}元钱,剩余{2}元钱.format(threading.current_thread(),money,gMoney))

class Consumer(threading.Thread):
    def run(self):
        global gMoney
        while True:
            money = random.randint(100,1000)
            gLock.acquire()
            if gMoney >= money:   # 当剩余钱大于随机生成的钱
                gMoney -= money
                print({0}消费了{1}元钱,剩余{2}元钱.format(threading.current_thread(), money, gMoney))
            else:
                if gTimes >= gAllTimes:
                    gLock.release()
                    break
                    print({0}消费了{1}元钱,剩余{2}元钱,钱不足!.format(threading.current_thread(),money,gMoney))

            gLock.release()


def main():
    for i in range(3):
        t2 = Consumer()
        t2.start()

    for i in range(4):
        t1 = Producer()
        t1.start()

if __name__ == __main__:
    main()

 

Lock版本生产者和消费者模式

标签:print   大于   次数   __name__   消费者模式   while   全局   随机   lock   

原文地址:https://www.cnblogs.com/suancaipaofan/p/13171769.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!