您的位置:首页 > 编程语言 > Python开发

python 多线程笔记(6)-- 生产者/消费者模式(续)

2016-02-03 02:59 639 查看
用 threading.Event() 也可以实现生产者/消费者模式

(自己拍脑袋想出来的,无法知道其正确性,请大神告知为谢!)

import threading
import time
import random

products = 20

class Producer(threading.Thread):
'''生产者'''
ix = [0] # 生产者实例个数
# 闭包,必须是数组,不能直接 ix = 0

def __init__(self):
super().__init__()
self.ix[0] += 1
self.setName('生产者' + str(self.ix[0]))

def run(self):
global producer_signal, products

while True:
if products < 10:
if not producer_signal.is_set(): producer_signal.set()
products += 1;
print("{}:库存告急。我努力生产了1件产品,现在产品总数量 {}".format(self.getName(), products))
else:
print("{}:库存充足。我努力生产了0件产品,现在产品总数量 {}".format(self.getName(), products))
if producer_signal.is_set(): producer_signal.wait()
time.sleep(random.randrange(1,4))

class Consumer(threading.Thread):
'''消费者'''
ix = [0] # 消费者实例个数
# 闭包,必须是数组,不能直接 ix = 0

def __init__(self):
super().__init__()
self.ix[0] += 1
self.setName('消费者' + str(self.ix[0]))

def run(self):
global consumer_signal, products

while True:
if products > 1:
if not consumer_signal.is_set(): consumer_signal.set()
products -= 1;
print("{}:我消费了1件产品,现在产品数量 {}".format(self.getName(), products))
else:
print("{}:我消费了0件产品。现在产品数量 {}".format(self.getName(), products))
if consumer_signal.is_set(): consumer_signal.wait()
time.sleep(random.randrange(2,6))

if __name__ == "__main__":

producer_signal = threading.Event()
consumer_signal = threading.Event()

for i in range(2):
p = Producer()
p.start()

for i in range(10):
c = Consumer()
c.start()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: