11.python并发入门(part8 基于线程队列实现生产者消费者模型)

简介:

一、什么是生产者消费者模型?

生产者就是生产数据的线程,消费者指的就是消费数据的线程。

在多线程开发过程中,生产者的速度比消费者的速度快,那么生产者就必须等待消费者把数据处理完,生产者才会产生新的数据,相对的,如果消费者处理数据的速度大于生产者,那么消费者就必须等待生产者。

为了解决这种问题,就有了生产者消费者模型。


生产者与消费者模型,是通过一个容器,来解决生产者和消费者之间的耦合性问题,生产者和消费者之间并不会直接通信,这样生产者就无需等待消费者处理完数据,生产者可以直接把数据扔给队列,这个时候消费者也无需找生产者要数据,直接去队列中取数据,这个队列,起到的就是一个缓冲区的作用,具有平衡生产者和消费者的处理能力。


二、基于队列的生产者消费者模型的示例。

ver1:

#!/usr/local/bin/python2.7

# -*- coding:utf-8 -*-

import time

import random

import Queue

import threading

q1 = Queue.Queue()

def producer(name):

    count = 0

    while count < 10:

        print  "making..."

        time.sleep(random.randrange(3))

        q1.put(count)

        print "procucer %s has produced %s baozi...." %(name,count)

        count += 1

        print "ok!"

def consumer(name):

    count = 0

    while count < 10:

        time.sleep(random.randrange(4))

        if not q1.empty():

            data = q1.get()

            print data

            print '\033[32;1mConsumer %s has eat %s baozi...\033[0m' %(name, data)

        else:

            print "not fond baozi"

        count += 1

if __name__ == '__main__':

    p1 = threading.Thread(target=producer,args=('A',))

    c1 = threading.Thread(target=consumer,args=('B',))

    p1.start()

    c1.start()


ver2:

#!/usr/local/bin/python2.7

# -*- coding:utf-8 -*-

import time

import random

import Queue

import threading

q1 = Queue.Queue()

def producer(name):

    count = 0

    while count < 10:

        print  "making..."

        time.sleep(random.randrange(3))

        q1.put(count)

        print "procucer %s has produced %s baozi...." %(name,count)

        count += 1

        q1.task_done()  #给队列发个信号,告诉队列put完毕

        #q1.join()

        print "ok!"

def consumer(name):

    count = 0

    while count < 10:

        q1.join() ##监听生产者发送给队列的信号

        time.sleep(random.randrange(4))

       # if not q1.empty():

        data = q1.get()

        #q1.task_done()

        print data

        print '\033[32;1mConsumer %s has eat %s baozi...\033[0m' %(name, data)

        #else:

        #print "not fond baozi"

        count += 1

if __name__ == '__main__':

    p1 = threading.Thread(target=producer,args=('A',))

    c1 = threading.Thread(target=consumer,args=('B',))

    c2 = threading.Thread(target=consumer,args=('C',))

    c3 = threading.Thread(target=consumer,args=('D',))

    p1.start()

    c1.start()

    c2.start()

    c3.start()




      本文转自苏浩智 51CTO博客,原文链接:http://blog.51cto.com/suhaozhi/1925548,如需转载请自行联系原作者




相关文章
|
2月前
|
Java API 调度
从阻塞到畅通:Java虚拟线程开启并发新纪元
从阻塞到畅通:Java虚拟线程开启并发新纪元
277 83
|
2月前
|
存储 Java 调度
Java虚拟线程:轻量级并发的革命性突破
Java虚拟线程:轻量级并发的革命性突破
222 83
|
4月前
|
机器学习/深度学习 消息中间件 存储
【高薪程序员必看】万字长文拆解Java并发编程!(9-2):并发工具-线程池
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的强力并发工具-线程池,废话不多说让我们直接开始。
181 0
|
4月前
|
调度 Python
探索Python高级并发与网络编程技术。
可以看出,Python的高级并发和网络编程极具挑战,却也饱含乐趣。探索这些技术,你将会发现:它们好比是Python世界的海洋,有穿越风暴的波涛,也有寂静深海的奇妙。开始旅途,探索无尽可能吧!
105 15
|
4月前
|
安全 Java 调度
Netty源码—3.Reactor线程模型二
本文主要介绍了NioEventLoop的执行总体框架、Reactor线程执行一次事件轮询、Reactor线程处理产生IO事件的Channel、Reactor线程处理任务队列之添加任务、Reactor线程处理任务队列之执行任务、NioEventLoop总结。
|
4月前
|
安全 Java
Netty源码—2.Reactor线程模型一
本文主要介绍了关于NioEventLoop的问题整理、理解Reactor线程模型主要分三部分、NioEventLoop的创建和NioEventLoop的启动。
|
6月前
|
机器学习/深度学习 存储 设计模式
Python 高级编程与实战:深入理解性能优化与调试技巧
本文深入探讨了Python的性能优化与调试技巧,涵盖profiling、caching、Cython等优化工具,以及pdb、logging、assert等调试方法。通过实战项目,如优化斐波那契数列计算和调试Web应用,帮助读者掌握这些技术,提升编程效率。附有进一步学习资源,助力读者深入学习。
|
3月前
|
Python
Python编程基石:整型、浮点、字符串与布尔值完全解读
本文介绍了Python中的四种基本数据类型:整型(int)、浮点型(float)、字符串(str)和布尔型(bool)。整型表示无大小限制的整数,支持各类运算;浮点型遵循IEEE 754标准,需注意精度问题;字符串是不可变序列,支持多种操作与方法;布尔型仅有True和False两个值,可与其他类型转换。掌握这些类型及其转换规则是Python编程的基础。
209 33
|
2月前
|
数据采集 分布式计算 大数据
不会Python,还敢说搞大数据?一文带你入门大数据编程的“硬核”真相
不会Python,还敢说搞大数据?一文带你入门大数据编程的“硬核”真相
79 1

推荐镜像

更多