作家
登录

用Python多线程实现生产者消费者模式

作者: 来源: 2017-05-16 15:29:04 阅读 我要评论

什么是临盆者花费者模式

在软件开辟的过程中,经常碰着如许的场景:

构造图如下:

为了大年夜家轻易懂得,我们举一个寄信的例子。假设你要寄一封信,大年夜致过程如下:

你把信写好——相当于临盆者临盆数据

你把信放入邮箱——相当于临盆者把数据放入缓冲区

邮递员把信大年夜邮箱掏出,做响应处理——相当于花费者把数据掏出缓冲区,处理数据

假设临盆者和花费者分别是两个线程。如不雅让临盆者直接调用花费者的某个办法,那么临盆者对于花费者就会产生依附(也就是耦合)。如不雅将来花费者的代码产生变更,可能会影响到临盆者的代码。而如不雅两者都依附于某个缓冲区,两者之间不直接依附,耦合也就响应降低了。

举个例子,我们却竽暌故局送达信件,如不雅不应用邮箱(也就是缓冲区),你必须得把信直接交给邮递员。有同窗会说,直接给邮递员不是挺简单的嘛?其实不简单,你必须 得熟悉谁是邮递员,才能把信给他。这就产生了你和邮递员之间的依附(相当于临盆者和花费者的强耦合)。万一哪天邮递员 换人了,你还要从新熟悉一下(相当于花费者变更导致修改临盆者代码)。而邮箱相对来说比较固定,你依附它的成本就比较低(相当于懈弛冲区之间的弱耦合)。

  • 并发

下面我们先看一段在Python中实现多线程的代码。

因为临盆者与花费者是两个自力的并发体,他们之间是用缓冲区通信的,临盆者只须要往缓冲区里丢数据,就可以持续临盆下一?数据,而花费者只须要大年夜缓冲区拿数据即可,如许就不会因为彼此的处理速度而产生壅塞。

持续膳绫擎的例子,如不雅我们不应用邮箱,就得在邮局等邮递员,直到他回来,把信件交给他,这时代我们啥事儿都不克不及干(也就是临盆者壅塞)。或者邮递员得挨家挨户问,谁要寄信(相当于花费者轮询)。

  • 支撑忙闲不均

当临盆者制造数据快的时刻,花费者来不及处理,未处理的数据可以临时存在缓冲区中,慢慢处理掉落。而不至于因为花费者的机能造成数据损掉或影响临盆者临盆。

我们再拿寄信的例子,假设邮递员一次只能带走1000封信,万一碰上恋人节(或是圣诞节)送贺卡,须要寄出去的信跨越了1000封,这时刻邮夏┞封个缓冲区就派上用处了。邮递员把来不及带走的信暂存在邮箱中,等下次过来时再拿走。

经由过程膳绫擎的介绍大年夜家应当已经明白了临盆者花费者模式。

某些模块负责临盆数据,这些数据由其他模块来负粜ウ理(此处的模块可能是:函数、线程、过程等)。产生数据的模块称为临盆者,而处理数据的模块称为花费者。在临盆者与花费者之间的缓冲区称之为仓库。临盆者负责往仓库运输商品,而花费者负责大年夜仓库里掏出商品,这就构成了临盆者花费者模式。

Python中的多线程编程

在实现临盆者花费者模式之前,我们先进修下Python中的多线程编程。

Python的标准库供给了两个模块:_thread和threading,_thread是初级模块,threading是高等模块,对_thread进行了封装。绝大年夜多半情况下,我们只须要应用threading这个高等模块。

线程是操作体系直接支撑的履行单位,高等说话平日都内置多线程的支撑,Python也不例外,并且Python的线程是真正的Posix Thread,而不是模仿出来的线程。

  1. import time,threading 
  2.  
  3. #线程代码 
  4.  
  5. class TaskThread(threading.Thread): 
  6.  
  7.     def __init__(self,name): 
  8.  
  9.         threading.Thread.__init__(self,name=name
  10.  
  11.     def run(self): 
  12.  
  13.         print('thread %s is running...' % self.getName()) 
  14.  
  15.   
  16.  
  17.         for i in range(6): 
  18.  
  19.             print('thread %s >>> %s' % (self.getName(), i)) 
  20.  
  21.             time.sleep(1) 
  22.  
  23.   
  24.  
  25.         print(
     1/4    1 2 3 4 下一页 尾页

      推荐阅读

      如何使用VCHA创建集群保护负载

    VCHA(VCenter Server High Availability)应用一个包含三个节点——active、passive和witness——的集群来尽量避免体系故障可能带来的影响。如不雅治理员想要应用 vC>>>详细阅读


    本文标题:用Python多线程实现生产者消费者模式

    地址:http://www.17bianji.com/lsqh/35243.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)