0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

隊(duì)列Queue的常用方法有哪些

冬至配餃子 ? 來(lái)源:多蘭多 ? 作者:Toranto ? 2022-08-19 10:24 ? 次閱讀

隊(duì)列-Queue

FIFO(先入先出)隊(duì)列Queue,LIFO(后入先出)隊(duì)列LifoQueue,和優(yōu)先級(jí)隊(duì)列PriorityQueue。

常用方法:

Queue.qsize() 返回隊(duì)列的大小

Queue.empty() 如果隊(duì)列為空,返回True,反之False

Queue.full() 如果隊(duì)列滿了,返回True,反之False,Queue.full 與 maxsize 大小對(duì)應(yīng)

Queue.get(item) 獲取隊(duì)列

Queue.get_nowait() 相當(dāng)于Queue.get(False),非阻塞方法

Queue.put(item) 寫(xiě)入隊(duì)列

Queue.task_done() 在完成一項(xiàng)工作之后,Queue.task_done()函數(shù)向任務(wù)已經(jīng)完成的隊(duì)列發(fā)送一個(gè)信號(hào)。每個(gè)get()調(diào)用得到一個(gè)任務(wù),接下來(lái)task_done()調(diào)用告訴隊(duì)列該任務(wù)已經(jīng)處理完畢。

Queue.join() 實(shí)際上意味著等到隊(duì)列為空,再執(zhí)行別的操作

Queue隊(duì)列方法主要用于我們的進(jìn)程間的通信。

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

進(jìn)程中的通信一個(gè)最主要的用途就是用于日后的爬蟲(chóng),當(dāng)我們需要爬取5000個(gè)網(wǎng)頁(yè)的時(shí)候,我們需要從瀏覽器首頁(yè)獲取所有的靜態(tài)資源(檢查網(wǎng)頁(yè)代碼),然后再通過(guò)內(nèi)容提取來(lái)提取出其中的URL(全局資源定位符),比如:www.baidu.com,這就和生產(chǎn)者消費(fèi)者模型很相似。

poYBAGL-81CAFPZaAABAIskz18Y515.png

我們來(lái)簡(jiǎn)單實(shí)現(xiàn)"生產(chǎn)者消費(fèi)者模型":

poYBAGL-83SAerpaAAFooz0TXXY921.png

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

進(jìn)程池-Pool

一、什么是進(jìn)程池?

在程序?qū)嶋H處理問(wèn)題過(guò)程中,忙時(shí)會(huì)有成千上萬(wàn)的任務(wù)需要被執(zhí)行,閑時(shí)可能只有零星任務(wù)。那么在成千上萬(wàn)個(gè)任務(wù)需要被執(zhí)行的時(shí)候,我們就需要去創(chuàng)建成千上萬(wàn)個(gè)進(jìn)程么?首先,創(chuàng)建進(jìn)程需要消耗時(shí)間,銷毀進(jìn)程也需要消耗時(shí)間。第二即便開(kāi)啟了成千上萬(wàn)的進(jìn)程,操作系統(tǒng)也不能讓他們同時(shí)執(zhí)行,這樣反而會(huì)影響程序的效率。因此我們不能無(wú)限制的根據(jù)任務(wù)開(kāi)啟或者結(jié)束進(jìn)程。那么我們要怎么做呢?

進(jìn)程池就是先定義一個(gè)池子,在里面放上固定數(shù)量的進(jìn)程,有需求來(lái)了,就拿一個(gè)池中的進(jìn)程來(lái)處理任務(wù),等到處理完畢,進(jìn)程并不關(guān)閉,而是將進(jìn)程再放回進(jìn)程池中繼續(xù)等待任務(wù)。如果有很多任務(wù)需要執(zhí)行,池中的進(jìn)程數(shù)量不夠,任務(wù)就要等待之前的進(jìn)程執(zhí)行任務(wù)完畢歸來(lái),拿到空閑進(jìn)程才能繼續(xù)執(zhí)行。也就是說(shuō),池中進(jìn)程的數(shù)量是固定的,那么同一時(shí)間最多有固定數(shù)量的進(jìn)程在運(yùn)行。這樣不會(huì)增加操作系統(tǒng)的調(diào)度難度,還節(jié)省了開(kāi)閉進(jìn)程的時(shí)間,也一定程度上能夠?qū)崿F(xiàn)并發(fā)效果。

二、程序類型

我們的程序有兩種:計(jì)算密集型、IO密集型

計(jì)算密集型:充分利用CPU,多線程可以充分利用多核(適合開(kāi)啟多進(jìn)程,但不適合開(kāi)啟很多)

IO密集型:大部分的時(shí)間都在阻塞隊(duì)列,而不是在運(yùn)行狀態(tài)(根本不適合開(kāi)啟多進(jìn)程)

poYBAGL-86CAdSbyAABqa8f7TT8718.png

信號(hào)量和多進(jìn)程的處理方式的差異在于,每n個(gè)信號(hào)量是同步的,也就是說(shuō),如果只設(shè)置了4個(gè)信號(hào)量,4個(gè)用戶先搶占了CPU,那剩余的496個(gè)任務(wù)量需要等待前面4個(gè)用戶完成了(100%)之后才能夠繼續(xù)進(jìn)行。而多進(jìn)程是異步的,但是由于計(jì)算機(jī)的CPU有限,采用時(shí)間片輪轉(zhuǎn)法進(jìn)行分配工作,所有的進(jìn)程都有機(jī)會(huì)同時(shí)開(kāi)始任務(wù),但一段(細(xì)微)時(shí)間后,時(shí)間片就會(huì)分配給其他進(jìn)程,這樣宏觀上看起來(lái)它是同時(shí)進(jìn)行的,但其中涉及到了非常多的計(jì)算機(jī)的進(jìn)程調(diào)度,但是信號(hào)量和多進(jìn)程的處理時(shí)間需要視情況而定。

進(jìn)程池在面對(duì)這種(做500件衣服)計(jì)算密集型的程序時(shí)具有非常高的效率,使用進(jìn)程池不涉及進(jìn)程調(diào)度,也就不浪費(fèi)時(shí)間,屬于流水線式24h晝夜不息工作模式,做完一件衣服立馬就會(huì)接手第二件、第三件......這種方式充分地利用了CPU,不會(huì)在創(chuàng)建進(jìn)程、進(jìn)程調(diào)度、銷毀進(jìn)程中浪費(fèi)時(shí)間。

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

從結(jié)果來(lái)看,我們可以發(fā)現(xiàn),進(jìn)程池的速度與多進(jìn)程和信號(hào)量比起來(lái)那是相當(dāng)?shù)耐廴?。所以該用哪種方法不用多說(shuō)了吧。



審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10702

    瀏覽量

    209366
  • fifo
    +關(guān)注

    關(guān)注

    3

    文章

    382

    瀏覽量

    43403
  • URL
    URL
    +關(guān)注

    關(guān)注

    0

    文章

    138

    瀏覽量

    15218
  • 進(jìn)程
    +關(guān)注

    關(guān)注

    0

    文章

    197

    瀏覽量

    13928
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    韋東山freeRTOS系列教程之隊(duì)列(queue)(5)

    文章目錄 系列教程總目錄 概述 5.1 隊(duì)列的特性 5.1.1 常規(guī)操作 5.1.2 傳輸數(shù)據(jù)的兩種方法 5.1.3 隊(duì)列的阻塞訪問(wèn) 5.2 隊(duì)列函數(shù) 5.2.1 創(chuàng)建 5.2.2 復(fù)
    的頭像 發(fā)表于 12-13 14:33 ?5677次閱讀
    韋東山freeRTOS系列教程之<b class='flag-5'>隊(duì)列</b>(<b class='flag-5'>queue</b>)(5)

    Linux下進(jìn)程通訊消息隊(duì)列

    ?MQ(message queue),從字面意思上看,本質(zhì)是個(gè)隊(duì)列,F(xiàn)IFO 先入先出,只不過(guò)隊(duì)列中存放的內(nèi)容是message 而已。MQ 是在消息的傳輸過(guò)程中保存消息的容器。多用于分布式系統(tǒng)之間
    的頭像 發(fā)表于 08-19 19:56 ?1711次閱讀
    Linux下進(jìn)程通訊消息<b class='flag-5'>隊(duì)列</b>

    RAW queue

    1queue支持FIFO 和PRIO 的任務(wù)阻塞策略,如果是FIFO 的話阻塞隊(duì)列的順序是按照先來(lái)后到的次序去排列阻塞任務(wù),PRIO 策略的話是按照優(yōu)先級(jí)的排序。具體的設(shè)置可以直接設(shè)置這個(gè)結(jié)構(gòu)體中
    發(fā)表于 02-27 14:06

    Queue隊(duì)列的作用是什么

    文章目錄前言Queue 隊(duì)列semaphore 信號(hào)量Mutex 互斥量微信公眾號(hào)前言FreeRTOS STM32CubeMX配置 內(nèi)存管理 任務(wù)管理上節(jié)介紹了用STM32CubeMX生成帶
    發(fā)表于 02-14 06:57

    消息隊(duì)列Queue相關(guān)資料推薦

    消息隊(duì)列QueueAPItx_queue_createtx_queue_deletex_queue_flushtx_queue_front_sendtx_queue_receivetx_queue_send_notifyAPItx_queue_createtx_queue_del
    發(fā)表于 02-22 06:53

    請(qǐng)問(wèn)為什么給queue數(shù)據(jù)隊(duì)列畫(huà)成了環(huán)形呢?

    請(qǐng)問(wèn)為什么 queue 數(shù)據(jù)隊(duì)列在《ARM 微控制器基礎(chǔ)與實(shí)戰(zhàn)》上給畫(huà)成了環(huán)形呢?
    發(fā)表于 03-09 10:55

    網(wǎng)絡(luò)中常用隊(duì)列管理方法比較

    本文主要介紹了網(wǎng)絡(luò)中常用的兩種隊(duì)列管理方法:先進(jìn)先出(FIFO)和隨機(jī)提前檢測(cè)(RED),并且通過(guò)實(shí)驗(yàn)比較了這兩種隊(duì)列管理方法在解決網(wǎng)絡(luò)擁塞控制方面的表現(xiàn),體現(xiàn)了研究
    發(fā)表于 05-25 11:24 ?9次下載

    Java多線程總結(jié)之Queue

    在Java多線程應(yīng)用中,隊(duì)列的使用率很高,多數(shù)生產(chǎn)消費(fèi)模型的首選數(shù)據(jù)結(jié)構(gòu)就是隊(duì)列。Java提供的線程安全的Queue可以分為 阻塞隊(duì)列和非阻塞隊(duì)列
    發(fā)表于 11-28 16:14 ?3246次閱讀
    Java多線程總結(jié)之<b class='flag-5'>Queue</b>

    ThreadX(九)------消息隊(duì)列Queue

    消息隊(duì)列QueueAPItx_queue_createtx_queue_deletex_queue_flushtx_queue_front_sendtx_queue_receivetx_queue_send_notifyAPItx_queue_createtx_queue_del
    發(fā)表于 12-28 19:35 ?2次下載
    ThreadX(九)------消息<b class='flag-5'>隊(duì)列</b><b class='flag-5'>Queue</b>

    STM32G0開(kāi)發(fā)筆記:使用FreeRTOS系統(tǒng)的隊(duì)列Queue

    使用Platformio平臺(tái)的libopencm3開(kāi)發(fā)框架來(lái)開(kāi)發(fā)STM32G0,下面為使用FreeRTOS系統(tǒng)的隊(duì)列Queue。
    的頭像 發(fā)表于 01-16 14:50 ?1226次閱讀

    什么是queue

    queue 容器,又稱隊(duì)列容器,是簡(jiǎn)單地裝飾deque容器而成為另外的一種容器。
    的頭像 發(fā)表于 02-27 15:43 ?1345次閱讀

    FreeRTOS消息隊(duì)列結(jié)構(gòu)體

    一個(gè)結(jié)構(gòu)體用于描述隊(duì)列,叫做 Queue_t,這個(gè)結(jié)構(gòu)體在文件 queue.c 中定義。 3、隊(duì)列創(chuàng)建 在使用
    的頭像 發(fā)表于 07-06 17:03 ?941次閱讀
    FreeRTOS消息<b class='flag-5'>隊(duì)列</b>結(jié)構(gòu)體

    RTOS中Queue的工作原理

    Queue即消息隊(duì)列是通過(guò)RTOS內(nèi)核提供的一種服務(wù)。它是一種線程間同步數(shù)據(jù)的安全方法。
    的頭像 發(fā)表于 07-25 15:45 ?2839次閱讀
    RTOS中<b class='flag-5'>Queue</b>的工作原理

    隊(duì)列實(shí)現(xiàn)棧的兩種方法

    兩個(gè)隊(duì)列實(shí)現(xiàn)一個(gè)棧 思路:兩個(gè)隊(duì)列實(shí)現(xiàn)一個(gè)棧,使用了隊(duì)列交換的思想。 代碼如下: type MyStack struct { queue1, que
    的頭像 發(fā)表于 10-08 16:01 ?519次閱讀

    OpenHarmony語(yǔ)言基礎(chǔ)類庫(kù)【@ohos.util.Queue (線性容器Queue)】

    Queue的特點(diǎn)是先進(jìn)先出,在尾部增加元素,在頭部刪除元素。根據(jù)循環(huán)隊(duì)列的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。
    的頭像 發(fā)表于 04-27 21:20 ?261次閱讀
    OpenHarmony語(yǔ)言基礎(chǔ)類庫(kù)【@ohos.util.<b class='flag-5'>Queue</b> (線性容器<b class='flag-5'>Queue</b>)】