Python 生产者消费者模型
生产者消费者模型:
- 解耦,通过队列降低耦合,支持并发,生产者和消费者是两个独立的并发体,他们之间使用缓冲区作为桥梁连接,生产者只往里丢数据,就可以生产下一个数据了,消费者从中拿数据,这样就不会阻塞,影响速度。可以很好的支持任务的忙闲不均匀的问题。
我们都知道实现生产者消费者模型的三要素:
- 生产者
- 消费者
- 队列 (或其他的容哭器,但队列不用考虑锁的问题)
写一个简单的生产者消费者模型的例子:
# -*- coding:utf-8 -*-
import time, threading, queue, random
# 队列 (先入先出)
q = queue.Queue()
# 生产者
def producer():
for i in range(1, 10):
time.sleep(random.random())
gold = "金币%d" % i
q.put(gold)
print("[%s]已生产 --> %s" % (time.ctime(), gold))
print("生产完成")
# 消费者
def consumer():
for i in range(1, 10):
time.sleep(random.random() * 3)
gold = q.get()
print("[%s]已使用 --> %s" % (time.strftime("%Y-%m-%d %H-%M-%S"), gold))
print('消费完毕')
if __name__ == '__main__':
t1 = threading.Thread(target=producer, name='producer')
t2 = threading.Thread(target=consumer, name='consumer')
t1.start()
t2.start()
t1.join()
t2.join()
大致的运行效果就是如此:
[Tue Feb 12 11:43:39 2019]已生产 --> 金币1
[Tue Feb 12 11:43:40 2019]已生产 --> 金币2
[2019-02-12 11-43-40]已使用 --> 金币1
[Tue Feb 12 11:43:40 2019]已生产 --> 金币3
[Tue Feb 12 11:43:40 2019]已生产 --> 金币4
[2019-02-12 11-43-40]已使用 --> 金币2
[Tue Feb 12 11:43:40 2019]已生产 --> 金币5
[Tue Feb 12 11:43:41 2019]已生产 --> 金币6
[Tue Feb 12 11:43:42 2019]已生产 --> 金币7
[2019-02-12 11-43-42]已使用 --> 金币3
[Tue Feb 12 11:43:42 2019]已生产 --> 金币8
[Tue Feb 12 11:43:43 2019]已生产 --> 金币9
生产完成
[2019-02-12 11-43-43]已使用 --> 金币4
[2019-02-12 11-43-45]已使用 --> 金币5
[2019-02-12 11-43-46]已使用 --> 金币6
[2019-02-12 11-43-46]已使用 --> 金币7
[2019-02-12 11-43-48]已使用 --> 金币8
[2019-02-12 11-43-48]已使用 --> 金币9
消费完毕