美文网首页
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