隊(duì)列-Queue
FIFO(先入先出)隊(duì)列Queue,LIFO(后入先出)隊(duì)列LifoQueue,和優(yōu)先級隊(duì)列PriorityQueue。
常用方法:
Queue.qsize() 返回隊(duì)列的大小
Queue.empty() 如果隊(duì)列為空,返回True,反之False
Queue.full() 如果隊(duì)列滿了,返回True,反之False,Queue.full 與 maxsize 大小對應(yīng)
Queue.get(item) 獲取隊(duì)列
Queue.get_nowait() 相當(dāng)于Queue.get(False),非阻塞方法
Queue.put(item) 寫入隊(duì)列
Queue.task_done() 在完成一項(xiàng)工作之后,Queue.task_done()函數(shù)向任務(wù)已經(jīng)完成的隊(duì)列發(fā)送一個信號。每個get()調(diào)用得到一個任務(wù),接下來task_done()調(diào)用告訴隊(duì)列該任務(wù)已經(jīng)處理完畢。
Queue.join() 實(shí)際上意味著等到隊(duì)列為空,再執(zhí)行別的操作
Queue隊(duì)列方法主要用于我們的進(jìn)程間的通信。
進(jìn)程中的通信一個最主要的用途就是用于日后的爬蟲,當(dāng)我們需要爬取5000個網(wǎng)頁的時候,我們需要從瀏覽器首頁獲取所有的靜態(tài)資源(檢查網(wǎng)頁代碼),然后再通過內(nèi)容提取來提取出其中的URL(全局資源定位符),比如:www.baidu.com,這就和生產(chǎn)者消費(fèi)者模型很相似。
我們來簡單實(shí)現(xiàn)"生產(chǎn)者消費(fèi)者模型":
進(jìn)程池-Pool
一、什么是進(jìn)程池?
在程序?qū)嶋H處理問題過程中,忙時會有成千上萬的任務(wù)需要被執(zhí)行,閑時可能只有零星任務(wù)。那么在成千上萬個任務(wù)需要被執(zhí)行的時候,我們就需要去創(chuàng)建成千上萬個進(jìn)程么?首先,創(chuàng)建進(jìn)程需要消耗時間,銷毀進(jìn)程也需要消耗時間。第二即便開啟了成千上萬的進(jìn)程,操作系統(tǒng)也不能讓他們同時執(zhí)行,這樣反而會影響程序的效率。因此我們不能無限制的根據(jù)任務(wù)開啟或者結(jié)束進(jìn)程。那么我們要怎么做呢?
進(jìn)程池就是先定義一個池子,在里面放上固定數(shù)量的進(jìn)程,有需求來了,就拿一個池中的進(jìn)程來處理任務(wù),等到處理完畢,進(jìn)程并不關(guān)閉,而是將進(jìn)程再放回進(jìn)程池中繼續(xù)等待任務(wù)。如果有很多任務(wù)需要執(zhí)行,池中的進(jìn)程數(shù)量不夠,任務(wù)就要等待之前的進(jìn)程執(zhí)行任務(wù)完畢歸來,拿到空閑進(jìn)程才能繼續(xù)執(zhí)行。也就是說,池中進(jìn)程的數(shù)量是固定的,那么同一時間最多有固定數(shù)量的進(jìn)程在運(yùn)行。這樣不會增加操作系統(tǒng)的調(diào)度難度,還節(jié)省了開閉進(jìn)程的時間,也一定程度上能夠?qū)崿F(xiàn)并發(fā)效果。
二、程序類型
我們的程序有兩種:計算密集型、IO密集型
計算密集型:充分利用CPU,多線程可以充分利用多核(適合開啟多進(jìn)程,但不適合開啟很多)
IO密集型:大部分的時間都在阻塞隊(duì)列,而不是在運(yùn)行狀態(tài)(根本不適合開啟多進(jìn)程)
信號量和多進(jìn)程的處理方式的差異在于,每n個信號量是同步的,也就是說,如果只設(shè)置了4個信號量,4個用戶先搶占了CPU,那剩余的496個任務(wù)量需要等待前面4個用戶完成了(100%)之后才能夠繼續(xù)進(jìn)行。而多進(jìn)程是異步的,但是由于計算機(jī)的CPU有限,采用時間片輪轉(zhuǎn)法進(jìn)行分配工作,所有的進(jìn)程都有機(jī)會同時開始任務(wù),但一段(細(xì)微)時間后,時間片就會分配給其他進(jìn)程,這樣宏觀上看起來它是同時進(jìn)行的,但其中涉及到了非常多的計算機(jī)的進(jìn)程調(diào)度,但是信號量和多進(jìn)程的處理時間需要視情況而定。
進(jìn)程池在面對這種(做500件衣服)計算密集型的程序時具有非常高的效率,使用進(jìn)程池不涉及進(jìn)程調(diào)度,也就不浪費(fèi)時間,屬于流水線式24h晝夜不息工作模式,做完一件衣服立馬就會接手第二件、第三件......這種方式充分地利用了CPU,不會在創(chuàng)建進(jìn)程、進(jìn)程調(diào)度、銷毀進(jìn)程中浪費(fèi)時間。
從結(jié)果來看,我們可以發(fā)現(xiàn),進(jìn)程池的速度與多進(jìn)程和信號量比起來那是相當(dāng)?shù)耐廴K栽撚媚姆N方法不用多說了吧。
審核編輯:劉清
-
cpu
+關(guān)注
關(guān)注
68文章
11083瀏覽量
217190 -
fifo
+關(guān)注
關(guān)注
3文章
402瀏覽量
44830 -
URL
+關(guān)注
關(guān)注
0文章
141瀏覽量
15870 -
進(jìn)程
+關(guān)注
關(guān)注
0文章
207瀏覽量
14292
發(fā)布評論請先 登錄
韋東山freeRTOS系列教程之隊(duì)列(queue)(5)

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

RAW queue 篇
Queue隊(duì)列的作用是什么
消息隊(duì)列Queue相關(guān)資料推薦
請問為什么給queue數(shù)據(jù)隊(duì)列畫成了環(huán)形呢?
網(wǎng)絡(luò)中常用的隊(duì)列管理方法比較
Java多線程總結(jié)之Queue

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

STM32G0開發(fā)筆記:使用FreeRTOS系統(tǒng)的隊(duì)列Queue
FreeRTOS消息隊(duì)列結(jié)構(gòu)體

用隊(duì)列實(shí)現(xiàn)棧的兩種方法
OpenHarmony語言基礎(chǔ)類庫【@ohos.util.Queue (線性容器Queue)】

評論