码迷,mamicode.com
首页 > 编程语言 > 详细

进程_线程 之(五) --- 生产者消费者

时间:2019-08-20 00:35:52      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:tar   需要   自动调用   div   for   global   pre   方法   rom   

同步锁

acquire([timeout])/release():  调用关联的锁的相应方法。 
wait([timeout]):   调用这个方法将使线程进入Condition的等待池等待通知,并释放锁。使用前线程必须已获得锁定,否则将抛出异常。 
notify():   调用这个方法将从等待池挑选一个线程并通知,收到通知的线程将自动调用acquire()尝试获得锁定(进入锁定池);其他线程仍然在等待池中。调用这个方法不会释放锁定。使用前线程必须已获得锁定,否则将抛出异常。 
notifyAll():   调用这个方法将通知等待池中所有的线程,这些线程都将进入锁定池尝试获得锁定。调用这个方法不会释放锁定。使用前线程必须已获得锁定,否则将抛出异常

生产者消费者

1 import threading
2 from time import sleep
3 
4 products = 0 # 定义一个产品变量
5 condition = threading.Condition() # 创建一个同步锁。为了保证生产者在生产过程中,消费者不去消费。不能让消费者去消费还在生产的产品
6 # lock = threading.Lock()
7 # 如果既有读又有写(生产者和消费者模式),不能加互斥锁,容易造成死锁
  • 生产者
 1 # 定于一个生产者类
 2 class Producter(threading.Thread):  # 继承自threading.Thread。重写线程类
 3     ix = [0] # 生产者的实例个数
 4 
 5     def __init__(self,):
 6         super().__init__()
 7         self.ix[0] += 1
 8         self.setName("生成者" + str(self.ix[0]))
 9 
10     def run(self):
11         global products
12         while True:
13             if condition.acquire(): # 加同步锁
14                 if products < 10:
15                     products += 1
16                     print("%s:库存少于10个,努力生产件产品,现在产品的总量为:%d"%(self.getName(),products))
17                 else:
18                     print("%s:库存多于10个,不需要继续生产,现在产品的总量为:%d"%(self.getName(),products))
19                     condition.wait() # 等待一下
20                 condition.release()
21                 sleep(2)
  • 消费者
 1 # 定义一个消费者
 2 class Consumer(threading.Thread):
 3     ix = [0]
 4 
 5     def __init__(self):
 6         super().__init__()
 7         self.ix[0] += 1
 8         self.setName("消费者"+str(self.ix[0]))
 9 
10     def run(self):
11         global products
12         while True:
13             if condition.acquire(): # 加同步锁
14                 if products > 1:
15                     products -= 1
16                     print("%s:我消费了1个产品,现在产品的数量为:%d"%(self.getName(),products))
17                 else:
18                     print("%s:就剩1个产品了,我将停止消费,现在产品的数量为:%d" % (self.getName(), products))
19                     condition.wait() #  锁等一下
20                 condition.release()
21                 sleep(2)
  • 调用
1 if __name__ == __main__:
2     for _ in range(2):
3         p = Producter()
4         p.start()
5     for _ in range(10):
6         c = Consumer()
7         c.start()
  • 结果
 1 """
 2 生成者1:库存少于10个,努力生产件产品,现在产品的总量为:1
 3 生成者2:库存少于10个,努力生产件产品,现在产品的总量为:2
 4 消费者1:我消费了1个产品,现在产品的数量为:1
 5 消费者2:就剩1个产品了,我将停止消费,现在产品的数量为:1
 6 消费者3:就剩1个产品了,我将停止消费,现在产品的数量为:1
 7 消费者4:就剩1个产品了,我将停止消费,现在产品的数量为:1
 8 消费者5:就剩1个产品了,我将停止消费,现在产品的数量为:1
 9 消费者6:就剩1个产品了,我将停止消费,现在产品的数量为:1
10 消费者7:就剩1个产品了,我将停止消费,现在产品的数量为:1
11 消费者8:就剩1个产品了,我将停止消费,现在产品的数量为:1
12 消费者9:就剩1个产品了,我将停止消费,现在产品的数量为:1
13 消费者10:就剩1个产品了,我将停止消费,现在产品的数量为:1
14 生成者1:库存少于10个,努力生产件产品,现在产品的总量为:2
15 生成者2:库存少于10个,努力生产件产品,现在产品的总量为:3
16 消费者1:我消费了1个产品,现在产品的数量为:2
17 生成者1:库存少于10个,努力生产件产品,现在产品的总量为:3
18 消费者1:我消费了1个产品,现在产品的数量为:2
19 生成者2:库存少于10个,努力生产件产品,现在产品的总量为:3
20 生成者1:库存少于10个,努力生产件产品,现在产品的总量为:4
21 消费者1:我消费了1个产品,现在产品的数量为:3
22 生成者2:库存少于10个,努力生产件产品,现在产品的总量为:4
23 生成者1:库存少于10个,努力生产件产品,现在产品的总量为:5
24 消费者1:我消费了1个产品,现在产品的数量为:4
25 生成者2:库存少于10个,努力生产件产品,现在产品的总量为:5
26 """

 

进程_线程 之(五) --- 生产者消费者

标签:tar   需要   自动调用   div   for   global   pre   方法   rom   

原文地址:https://www.cnblogs.com/TMMM/p/11380501.html

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