0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

队列Queue的常用方法有哪些

冬至配饺子 来源:多兰多 作者:Toranto 2022-08-19 10:24 次阅读

队列-Queue

FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue。

常用方法:

Queue.qsize() 返回队列的大小

Queue.empty() 如果队列为空,返回True,反之False

Queue.full() 如果队列满了,返回True,反之False,Queue.full 与 maxsize 大小对应

Queue.get(item) 获取队列

Queue.get_nowait() 相当于Queue.get(False),非阻塞方法

Queue.put(item) 写入队列

Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号。每个get()调用得到一个任务,接下来task_done()调用告诉队列该任务已经处理完毕。

Queue.join() 实际上意味着等到队列为空,再执行别的操作

Queue队列方法主要用于我们的进程间的通信

poYBAGL-8zGAacc-AADl10N96tk172.pngpoYBAGL-8zeASJwcAADn1hwS3RM691.pngpYYBAGL-8z2AWRjfAACVSNAkYPw254.png

进程中的通信一个最主要的用途就是用于日后的爬虫,当我们需要爬取5000个网页的时候,我们需要从浏览器首页获取所有的静态资源(检查网页代码),然后再通过内容提取来提取出其中的URL(全局资源定位符),比如:www.baidu.com,这就和生产者消费者模型很相似。

poYBAGL-81CAFPZaAABAIskz18Y515.png

我们来简单实现"生产者消费者模型":

poYBAGL-83SAerpaAAFooz0TXXY921.png

poYBAGL-83qAFNFfAACyi12-0es053.png
poYBAGL-84-AII18AADGzJaoEo0934.png

进程池-Pool

一、什么是进程池?

在程序实际处理问题过程中,忙时会有成千上万的任务需要被执行,闲时可能只有零星任务。那么在成千上万个任务需要被执行的时候,我们就需要去创建成千上万个进程么?首先,创建进程需要消耗时间,销毁进程也需要消耗时间。第二即便开启了成千上万的进程,操作系统也不能让他们同时执行,这样反而会影响程序的效率。因此我们不能无限制的根据任务开启或者结束进程。那么我们要怎么做呢?

进程池就是先定义一个池子,在里面放上固定数量的进程,有需求来了,就拿一个池中的进程来处理任务,等到处理完毕,进程并不关闭,而是将进程再放回进程池中继续等待任务。如果有很多任务需要执行,池中的进程数量不够,任务就要等待之前的进程执行任务完毕归来,拿到空闲进程才能继续执行。也就是说,池中进程的数量是固定的,那么同一时间最多有固定数量的进程在运行。这样不会增加操作系统的调度难度,还节省了开闭进程的时间,也一定程度上能够实现并发效果。

二、程序类型

我们的程序有两种:计算密集型、IO密集型

计算密集型:充分利用CPU,多线程可以充分利用多核(适合开启多进程,但不适合开启很多)

IO密集型:大部分的时间都在阻塞队列,而不是在运行状态(根本不适合开启多进程)

poYBAGL-86CAdSbyAABqa8f7TT8718.png

信号量和多进程的处理方式的差异在于,每n个信号量是同步的,也就是说,如果只设置了4个信号量,4个用户先抢占了CPU,那剩余的496个任务量需要等待前面4个用户完成了(100%)之后才能够继续进行。而多进程是异步的,但是由于计算机的CPU有限,采用时间片轮转法进行分配工作,所有的进程都有机会同时开始任务,但一段(细微)时间后,时间片就会分配给其他进程,这样宏观上看起来它是同时进行的,但其中涉及到了非常多的计算机的进程调度,但是信号量和多进程的处理时间需要视情况而定。

进程池在面对这种(做500件衣服)计算密集型的程序时具有非常高的效率,使用进程池不涉及进程调度,也就不浪费时间,属于流水线式24h昼夜不息工作模式,做完一件衣服立马就会接手第二件、第三件......这种方式充分地利用了CPU,不会在创建进程、进程调度、销毁进程中浪费时间。

pYYBAGL-89iAPa9PAADorCKHLs8464.pngpYYBAGL-896AX1VFAAEv_aNtIQI093.pngpoYBAGL-8-WAdkj-AAAxgGL6Gwo470.png
poYBAGL-8-uADXQhAADkvTvFXk8244.png

从结果来看,我们可以发现,进程池的速度与多进程和信号量比起来那是相当的哇塞。所以该用哪种方法不用多说了吧。



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10443

    浏览量

    206566
  • fifo
    +关注

    关注

    3

    文章

    369

    浏览量

    43069
  • URL
    URL
    +关注

    关注

    0

    文章

    134

    浏览量

    14830
  • 进程
    +关注

    关注

    0

    文章

    193

    浏览量

    13876
收藏 人收藏

    评论

    相关推荐

    韦东山freeRTOS系列教程之队列(queue)(5)

    文章目录 系列教程总目录 概述 5.1 队列的特性 5.1.1 常规操作 5.1.2 传输数据的两种方法 5.1.3 队列的阻塞访问 5.2 队列函数 5.2.1 创建 5.2.2 复
    的头像 发表于 12-13 14:33 5484次阅读
    韦东山freeRTOS系列教程之<b class='flag-5'>队列</b>(<b class='flag-5'>queue</b>)(5)

    队列与C++中的queue详解

    队列就是一种线性的数据结构,它与日常生活中排队的队列相似,即先进先出(LIFO, First In First Out),这点也是它与栈(Stack)的最大不同之处。
    的头像 发表于 07-18 17:31 751次阅读
    <b class='flag-5'>队列</b>与C++中的<b class='flag-5'>queue</b>详解

    labview while循环中的获取队列(Obtain Queue)导致内存泄漏

    问题: 我程序的 While 循环中有一个获取队列的函数。queue name 的输入没有改变,输入 create if not found 设置为真。因为 create if not found
    发表于 11-22 16:03

    RAW queue

    1queue支持FIFO 和PRIO 的任务阻塞策略,如果是FIFO 的话阻塞队列的顺序是按照先来后到的次序去排列阻塞任务,PRIO 策略的话是按照优先级的排序。具体的设置可以直接设置这个结构体中
    发表于 02-27 14:06

    Queue队列的作用是什么

    文章目录前言Queue 队列semaphore 信号量Mutex 互斥量微信公众号前言FreeRTOS STM32CubeMX配置 内存管理 任务管理上节介绍了用STM32CubeMX生成带
    发表于 02-14 06:57

    消息队列Queue相关资料推荐

    消息队列QueueAPItx_queue_createtx_queue_deletex_queue_flushtx_queue_front_sendtx_queue_receivetx_queue_send_notifyAPItx_queue_createtx_queue_del
    发表于 02-22 06:53

    请问为什么给queue数据队列画成了环形呢?

    请问为什么 queue 数据队列在《ARM 微控制器基础与实战》上给画成了环形呢?
    发表于 03-09 10:55

    网络中常用队列管理方法比较

    本文主要介绍了网络中常用的两种队列管理方法:先进先出(FIFO)和随机提前检测(RED),并且通过实验比较了这两种队列管理方法在解决网络拥塞控制方面的表现,体现了研究
    发表于 05-25 11:24 9次下载

    Java多线程总结之Queue

    在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列。Java提供的线程安全的Queue可以分为 阻塞队列和非阻塞队列
    发表于 11-28 16:14 3152次阅读
    Java多线程总结之<b class='flag-5'>Queue</b>

    ThreadX(九)------消息队列Queue

    消息队列QueueAPItx_queue_createtx_queue_deletex_queue_flushtx_queue_front_sendtx_queue_receivetx_queue_send_notifyAPItx_queue_createtx_queue_del
    发表于 12-28 19:35 2次下载
    ThreadX(九)------消息<b class='flag-5'>队列</b><b class='flag-5'>Queue</b>

    STM32G0开发笔记:使用FreeRTOS系统的队列Queue

    使用Platformio平台的libopencm3开发框架来开发STM32G0,下面为使用FreeRTOS系统的队列Queue
    的头像 发表于 01-16 14:50 968次阅读

    什么是queue

    queue 容器,又称队列容器,是简单地装饰deque容器而成为另外的一种容器。
    的头像 发表于 02-27 15:43 998次阅读

    FreeRTOS消息队列结构体

    有一个结构体用于描述队列,叫做 Queue_t,这个结构体在文件 queue.c 中定义。 3、队列创建 在使用队列之前必须先创建
    的头像 发表于 07-06 17:03 678次阅读
    FreeRTOS消息<b class='flag-5'>队列</b>结构体

    RTOS中Queue的工作原理

    Queue即消息队列是通过RTOS内核提供的一种服务。它是一种线程间同步数据的安全方法
    的头像 发表于 07-25 15:45 1861次阅读
    RTOS中<b class='flag-5'>Queue</b>的工作原理

    队列实现栈的两种方法

    两个队列实现一个栈 思路:两个队列实现一个栈,使用了队列交换的思想。 代码如下: type MyStack struct { queue1, que
    的头像 发表于 10-08 16:01 424次阅读