'''
首先对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()
```
网友评论