IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 多线程threading.Thread+队列queue实现生产者消费者 -> 正文阅读

[大数据]多线程threading.Thread+队列queue实现生产者消费者

Python的Queue模块提供了同步的,线程安全的队列类,包括:FIFO队列Queue,LIFO队列LifeQueue,优先级队列PriorityQueue,这些队列都实现了锁原语,能在多线程中直接使用,可以使用队列来实现线程间的同步。

初始化Queue()对象时(如:q=Queue()),若括号中没有指定最大可接收的消息数量,或数量为负数,那么就代表可接收的消息数量没有上限。

队列的方法:(三种队列适用)

Queue.task_done():完成一项工作后,使用此方法可以向队列发送一个信号,表示该任务执行完毕。
Queue.join():等到队列中所有任务(数据)执行完毕后,再往下执行,否则一直等待;join()是判断依据,不单单指队列中没有数据,数据get出去之后,要使用task_done()向队列发送一个信号,表示该任务(数据使用)执行完毕。
Queue.qsize():返回当前队列包含的消息数量
Queue.empty():如果队列为空,返回True,反之返回False
Queue.full():如果队列满了,返回True,反之返回False
Queue.put(item, block=True, timeout=None):写入队列,block表示是否等待,timeout表示等待时长

Queue.get(block=True, timeout=None):获取队列,block表示是否等待,timeout表示等待时长
Queue.put_nowait(item):等同于Queue.put(item,False)
Queue.get_nowait():等同于Queue.get(False)

生产者消费者模式:

为什么使用生产者和消费者模式:

? ? ? ? 在线程的世界里,生产者就是产生数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者必须等待消费者处理完,产能继续生产数据;同样的道理,如果消费者处理能力大于生产者,那么消费者就必须要等待生产者,为了解决这个问题,于是引入了生产者和消费者模式。

什么是生产者消费者模式:

? ? ? ? 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者不直接通讯,而通过阻塞队列来通讯,所以生产者产生完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。

生产者消费者示例

import queue
import threading
import time

q = queue.Queue()


class Producer(threading.Thread):
    """生产商品的线程类,判断队列是否小于50,小于50之后就生产200个商品,生产完一轮休息1秒"""

    def run(self):
        while True:
            if q.qsize() <= 50:
                print("生产前队列长度为:{}".format(q.qsize()))
                for i in range(200):
                    q.put("生产商品{}".format(i))
                time.sleep(1)


class Consumer(threading.Thread):
    """消费商品的线程类,当商品数量大于10的时候就消费商品,每次消费3个,当商品数量小于10的时候就休息2秒"""

    def run(self):
        while True:
            if q.qsize() >= 10:
                print("消费前队列长度为:{}".format(q.qsize()))
                for i in range(3):
                    goods = q.get()
                    print(f"消费的商品是:{goods}")
            else:
                time.sleep(2)


p = Producer()
p.start()  # 启动1个生产者线程
for i in range(5):  # 启动5个消费者线程
    c = Consumer()
    c.start()

运行结果:

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-01-29 23:09:15  更:2022-01-29 23:10:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 14:51:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码