什么是临盆者花费者模式
在软件开辟的过程中,经常碰着如许的场景:
构造图如下:

为了大年夜家轻易懂得,我们举一个寄信的例子。假设你要寄一封信,大年夜致过程如下:
你把信写好——相当于临盆者临盆数据
你把信放入邮箱——相当于临盆者把数据放入缓冲区
邮递员把信大年夜邮箱掏出,做响应处理——相当于花费者把数据掏出缓冲区,处理数据
假设临盆者和花费者分别是两个线程。如不雅让临盆者直接调用花费者的某个办法,那么临盆者对于花费者就会产生依附(也就是耦合)。如不雅将来花费者的代码产生变更,可能会影响到临盆者的代码。而如不雅两者都依附于某个缓冲区,两者之间不直接依附,耦合也就响应降低了。
举个例子,我们却竽暌故局送达信件,如不雅不应用邮箱(也就是缓冲区),你必须得把信直接交给邮递员。有同窗会说,直接给邮递员不是挺简单的嘛?其实不简单,你必须 得熟悉谁是邮递员,才能把信给他。这就产生了你和邮递员之间的依附(相当于临盆者和花费者的强耦合)。万一哪天邮递员 换人了,你还要从新熟悉一下(相当于花费者变更导致修改临盆者代码)。而邮箱相对来说比较固定,你依附它的成本就比较低(相当于懈弛冲区之间的弱耦合)。
- 并发
下面我们先看一段在Python中实现多线程的代码。
因为临盆者与花费者是两个自力的并发体,他们之间是用缓冲区通信的,临盆者只须要往缓冲区里丢数据,就可以持续临盆下一?数据,而花费者只须要大年夜缓冲区拿数据即可,如许就不会因为彼此的处理速度而产生壅塞。
持续膳绫擎的例子,如不雅我们不应用邮箱,就得在邮局等邮递员,直到他回来,把信件交给他,这时代我们啥事儿都不克不及干(也就是临盆者壅塞)。或者邮递员得挨家挨户问,谁要寄信(相当于花费者轮询)。
- 支撑忙闲不均
当临盆者制造数据快的时刻,花费者来不及处理,未处理的数据可以临时存在缓冲区中,慢慢处理掉落。而不至于因为花费者的机能造成数据损掉或影响临盆者临盆。
我们再拿寄信的例子,假设邮递员一次只能带走1000封信,万一碰上恋人节(或是圣诞节)送贺卡,须要寄出去的信跨越了1000封,这时刻邮夏┞封个缓冲区就派上用处了。邮递员把来不及带走的信暂存在邮箱中,等下次过来时再拿走。
经由过程膳绫擎的介绍大年夜家应当已经明白了临盆者花费者模式。
某些模块负责临盆数据,这些数据由其他模块来负粜ウ理(此处的模块可能是:函数、线程、过程等)。产生数据的模块称为临盆者,而处理数据的模块称为花费者。在临盆者与花费者之间的缓冲区称之为仓库。临盆者负责往仓库运输商品,而花费者负责大年夜仓库里掏出商品,这就构成了临盆者花费者模式。
Python中的多线程编程
在实现临盆者花费者模式之前,我们先进修下Python中的多线程编程。
Python的标准库供给了两个模块:_thread和threading,_thread是初级模块,threading是高等模块,对_thread进行了封装。绝大年夜多半情况下,我们只须要应用threading这个高等模块。
线程是操作体系直接支撑的履行单位,高等说话平日都内置多线程的支撑,Python也不例外,并且Python的线程是真正的Posix Thread,而不是模仿出来的线程。
- import time,threading
- #线程代码
- class TaskThread(threading.Thread):
- def __init__(self,name):
- threading.Thread.__init__(self,name=name)
- def run(self):
- print('thread %s is running...' % self.getName())
- for i in range(6):
- print('thread %s >>> %s' % (self.getName(), i))
- time.sleep(1)
- print(
推荐阅读
VCHA(VCenter Server High Availability)应用一个包含三个节点——active、passive和witness——的集群来尽量避免体系故障可能带来的影响。如不雅治理员想要应用 vC>>>详细阅读
本文标题:用Python多线程实现生产者消费者模式
地址:http://www.17bianji.com/lsqh/35243.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示