|
发表于 2017-6-8 12:22:33
|
显示全部楼层
本帖最后由 SixPy 于 2017-6-8 12:36 编辑
生产者、消费者 模式
- import threading
- import queue
- import random as r
- class 消费者(threading.Thread):
- def __init__(self, queue, lock, name=''):
- threading.Thread.__init__(self)
- self._queue = queue
- self.lock = lock
- self.name = name
- def run(self):
- while 1:
- msg = self._queue.get()
- if isinstance(msg, str) and msg == 'quit':
- break
- with self.lock:
- print("线程:%s,数据:%s" % (self.name, msg))
-
- with self.lock:
- print("线程:%s 结束!" % self.name)
-
- def 生产者():
-
- lck = threading.Lock() # 锁,用于同步 print()输出。
- quels = [queue.Queue() for i in range(3)]# 数据队列
- workers = [消费者(quels[n], lck, n) for n in range(3)]
- for w in workers:
- w.start() # 开启消费者线程
- for i in range(2000):#大循环
- for q in quels:
- q.queue.clear()#三个队列,每次循环开始时清空
- for each in range(100):#小循环
- x=r.randint(i+30,i+60)+each#涉及到大、小循环变量的几个函数,这里用random示意
- y=r.randint(i+60,i+120)+each
- z=r.randint(i+60,i+180)+each
-
- res=2.5*x-y-z
- if res>=50:
- quels[0].put(each) # 数据压入队列,给消费线程使用
- if -50<res<50:
- quels[1].put(each)
- if res<=-50:
- quels[2].put(each)
- for q in quels:
- q.put('quit') # 线程退出消息
-
- for w in workers:
- w.join() # 等待消费者线程结束
- 生产者()
复制代码 |
|