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

在开发软件的历程中,常常遇到如此的情景:一些模块承担生产制造数据信息,这种数据信息由别的模块来承担解决(这里的模块可能是:函数公式、线程、过程等)。造成信息的模块称之为生产者,而解决信息的模块称之为消费者。在生产者与消费者中间的缓冲区称作库房。生产者承担往库房运送产品,而消费者承担从库房里取下产品,这就组成了生产者消费者方式。

框架图如下所示:

为了更好地大伙儿非常容易了解,大家举一个写信的事例。假定你需要寄一封信,大概全过程如下所示: 1、你将信写好——等同于生产者生产制造数据信息 2、你将信放进电子邮箱——等同于生产者把数据信息放进缓冲区 3、邮递员把信从电子邮箱取下,做相对应解决——等同于消费者把数据信息取下缓冲区,解决数据信息

举例说明,我们去邮政局递送信函,如果不应用电子邮箱(也就是缓冲区),你务必得把信立即交到邮递员。有老同学聚会说,立即给邮递员并不是挺简易的嘛?实际上不容易,你务必 得了解哪位邮递员,才可以把信为他。这就形成了你跟邮递员中间的依靠(等同于生产者和消费者的强藕合)。万一哪天邮递员 换别人了,你还需要重新了解一下(等同于消费者转变造成改动生产者编码)。而电子邮箱相对而言较为固定不动,你依靠它的费用就非常低(等同于和缓冲区中间的弱藕合)。

再次上边的事例,如果我们不应用电子邮箱,就得在邮政局等邮递员,直到他回家,把信函交到他,这过程中大家啥烦心事都不可以干(也就是生产者堵塞)。或是邮递员得挨家挨户问,谁要写信(等同于消费者轮询)。

大家再拿写信的事例,假定邮递员一次只有带去1000一封信,万一遇上七夕节(或者圣诞)送生日卡,必须寄出的信超出了1000封,此刻电子邮箱这一缓冲区就找到用处了。邮递员把赶不及拿走的信暂存有电子邮箱中,等下一次回来时再取走。

根据以上的讲解我们应当己经懂了生产者消费者方式。

在完成生产者消费者方式以前,大家先学习培训下Python中的多线程程序编写。线程是电脑操作系统立即适用的实行模块,程序设计语言通常都内嵌多线程的适用,Python也是如此,而且Python的线程是真真正正的Posix Thread,而不是仿真模拟出來的线程。Python的标准库给予了2个模块:_thread和threading,_thread是低等模块,threading是高級模块,对_thread开展了封装形式。绝大部分状况下,大家只要应用threading这一高級模块。

下边大家首先看一段在Python中完成多线程的编码。

下边是应用程序的实行結果:

TaskThread类承继自threading模块中的Thread线程类。构造方法的name主要参数特定线程的名称,根据轻载父类run函数完成具体内容。

在简易了解了Python的线程后,下边大家完成一个生产者消费者模shi。

实行結果很有可能如下所示:

由于多线程是占领式实行的,因此打印出出的运作結果不一定和上边的完全一致。

本例根据Python完成了一个简便的生产者消费者实体模型。Python中的Queue模块早已出示了对线程同歩的适用,因此文中并没涉及到锁、同歩、死锁等多线程问题。

扫码免费用

源码支持二开

申请免费使用

在线咨询