美文网首页
Condition版生产者与消费者模式

Condition版生产者与消费者模式

作者: 徒手說梦话 | 来源:发表于2019-02-14 13:07 被阅读0次
    '''
    首先对threading.Condition相关的函数做个介绍,threading.Condition类似threading.Lock,可以在修改全局数据的时候进行上锁,也可以在修改完毕后进行解锁。
    
    acquire:上锁。
    release:解锁。
    wait:将当前线程处于等待状态,并且会释放锁。可以被其他线程使用notify和notify_all函数唤醒。被唤醒后会继续等待上锁,上锁后继续执行下面的代码。
    notify:通知某个正在等待的线程,默认是第1个等待的线程。
    notify_all:通知所有正在等待的线程。notify和notify_all不会释放锁。并且需要在release之前调用。
    
    '''
    import time
    import threading
    import random
    
    gMoney = 1000 # 初始值
    gCondition = threading.Condition()
    gTotalTime = 10 # 次数
    gTime = 0
    
    class Producer(threading.Thread):
        def run(self):
            global gMoney
            global gTime
            while True:
                money = random.randint(100,1000)
                gCondition.acquire()
                if gTime >= 10:
                    gCondition.release()
                    break
                gMoney += money
                print("%s生产了%d元,剩余%d元钱" % (threading.current_thread(),money,gMoney))
                gTime +=1
                gCondition.notify_all() # 通知wait()
                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 gTime >= gTotalTime:
                        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版生产者与消费者模式

          本文链接:https://www.haomeiwen.com/subject/fjceeqtx.html