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,如需转载请自行联系原作者




相关文章
|
6月前
|
机器学习/深度学习 数据采集 数据挖掘
基于 GARCH -LSTM 模型的混合方法进行时间序列预测研究(Python代码实现)
基于 GARCH -LSTM 模型的混合方法进行时间序列预测研究(Python代码实现)
225 2
|
5月前
|
机器学习/深度学习 数据采集 并行计算
多步预测系列 | LSTM、CNN、Transformer、TCN、串行、并行模型集合研究(Python代码实现)
多步预测系列 | LSTM、CNN、Transformer、TCN、串行、并行模型集合研究(Python代码实现)
548 2
|
8月前
|
存储 机器学习/深度学习 人工智能
稀疏矩阵存储模型比较与在Python中的实现方法探讨
本文探讨了稀疏矩阵的压缩存储模型及其在Python中的实现方法,涵盖COO、CSR、CSC等常见格式。通过`scipy.sparse`等工具,分析了稀疏矩阵在高效运算中的应用,如矩阵乘法和图结构分析。文章还结合实际场景(推荐系统、自然语言处理等),提供了优化建议及性能评估,并展望了稀疏计算与AI硬件协同的未来趋势。掌握稀疏矩阵技术,可显著提升大规模数据处理效率,为工程实践带来重要价值。
385 58
|
5月前
|
算法 安全 新能源
基于DistFlow的含分布式电源配电网优化模型【IEEE39节点】(Python代码实现)
基于DistFlow的含分布式电源配电网优化模型【IEEE39节点】(Python代码实现)
436 0
|
8月前
|
机器学习/深度学习 人工智能 PyTorch
200行python代码实现从Bigram模型到LLM
本文从零基础出发,逐步实现了一个类似GPT的Transformer模型。首先通过Bigram模型生成诗词,接着加入Positional Encoding实现位置信息编码,再引入Single Head Self-Attention机制计算token间的关系,并扩展到Multi-Head Self-Attention以增强表现力。随后添加FeedForward、Block结构、残差连接(Residual Connection)、投影(Projection)、层归一化(Layer Normalization)及Dropout等组件,最终调整超参数完成一个6层、6头、384维度的“0.0155B”模型
458 11
200行python代码实现从Bigram模型到LLM
|
6月前
|
机器学习/深度学习 算法 调度
【切负荷】计及切负荷和直流潮流(DC-OPF)风-火-储经济调度模型研究【IEEE24节点】(Python代码实现)
【切负荷】计及切负荷和直流潮流(DC-OPF)风-火-储经济调度模型研究【IEEE24节点】(Python代码实现)
292 0
|
9月前
|
机器学习/深度学习 人工智能 算法
Python+YOLO v8 实战:手把手教你打造专属 AI 视觉目标检测模型
本文介绍了如何使用 Python 和 YOLO v8 开发专属的 AI 视觉目标检测模型。首先讲解了 YOLO 的基本概念及其高效精准的特点,接着详细说明了环境搭建步骤,包括安装 Python、PyCharm 和 Ultralytics 库。随后引导读者加载预训练模型进行图片验证,并准备数据集以训练自定义模型。最后,展示了如何验证训练好的模型并提供示例代码。通过本文,你将学会从零开始打造自己的目标检测系统,满足实际场景需求。
9313 1
Python+YOLO v8 实战:手把手教你打造专属 AI 视觉目标检测模型
|
4月前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
227 6
|
7月前
|
Java API 微服务
为什么虚拟线程将改变Java并发编程?
为什么虚拟线程将改变Java并发编程?
382 83
|
9月前
|
机器学习/深度学习 消息中间件 存储
【高薪程序员必看】万字长文拆解Java并发编程!(9-2):并发工具-线程池
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的强力并发工具-线程池,废话不多说让我们直接开始。
351 0

热门文章

最新文章

推荐镜像

更多