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

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

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

淺析線程的信號量和進(jìn)程的信號量用法

冬至配餃子 ? 來源:多蘭多 ? 作者:Toranto ? 2022-08-19 10:56 ? 次閱讀

信號量-Semaphore

線程的信號量和進(jìn)程的信號量用法無異:

pYYBAGL--g-AO_BzAACWToGWcWQ982.png
poYBAGL--hSAaxxiAADdZ2xDWhs986.png

事件-Event

通過event類將兩個方法連接起來進(jìn)行溝通:

poYBAGL--jOAT8DWAADQVZsrcs0599.pngpYYBAGL--jmAJUpxAADOSHuAf9I332.png

線程池-ThreadPoolExecutor

線程池和進(jìn)程池用法是幾乎無異的,但是要注意它導(dǎo)入的模塊,提交的方法,參數(shù)的填寫方法,以及關(guān)閉的方法:

pYYBAGL--lmAcSNWAACp_ffExrU976.pngpoYBAGL--l6Ab_5iAAEkdhtQ5c4710.png

如果涉及返回值的時候呢?

直接打印的話會打印出一串內(nèi)存地址(自己嘗試)這時候需要調(diào)用.result方法(第14行)

poYBAGL--nqAErMQAAC6VzwrZFc462.pngpYYBAGL--n-AcAkrAACY2TFzDTY877.png

但是我們從結(jié)果上看,程序變成了一個同步程序,大大降低了我們的效率。這時候我們可以采用新建列表的方式來進(jìn)行優(yōu)化:

pYYBAGL--pyATtBsAADiP20ScmM706.pngpoYBAGL--qKAJrIvAAC_Qt_Jq94780.png

協(xié)程-greenlet

我們都知道:

①進(jìn)程是計算機(jī)中最小的資源分配單位·

②線程是計算機(jī)中能被cpu調(diào)度的最小單位

現(xiàn)在有一個問題:能開啟的線程和進(jìn)程是有限的,但是我們要處理的任務(wù)是無限的。比如我現(xiàn)在有5萬個任務(wù)要執(zhí)行,難道我去開5萬個線程嗎?然后假設(shè)我開了300個線程,但是這300個線程都阻塞了,我仍然沒有充分利用CPU,(理想的情況是開啟一個線程,沒有IO只有計算,這叫充分利用CPU,但大多數(shù)的情況不是這樣的,多多少少會有一些阻塞情況),這時候協(xié)程(纖程)就派上用場了。一條線程在多個任務(wù)之間來回切換,切換這個動作是需要浪費(fèi)時間的,但是對于CPU、操作系統(tǒng)來說,協(xié)程是不存在的,它們只能看見最小單位即線程。把一個線程的工作分成了好幾個任務(wù),在多個任務(wù)中來回切換的現(xiàn)象稱為協(xié)程。

pYYBAGL--ryATGHIAABArqsJgks044.png

寫一個簡單地生產(chǎn)者消費(fèi)者模型:

poYBAGL--syAbqrPAABXjKwQRKQ878.png

①協(xié)程能把一個線程的執(zhí)行明確的區(qū)分開

②兩個任務(wù),協(xié)程幫助我記住哪個任務(wù)執(zhí)行到哪個位置上了,并且實現(xiàn)安全的切換

③一個任務(wù)不得不陷入阻塞了,在這個任務(wù)阻塞的過程中切換到另一個任務(wù)繼續(xù)執(zhí)行

④你的程序只要還有任務(wù)需要執(zhí)行你的當(dāng)前線程永遠(yuǎn)不會阻塞

⑤利用協(xié)程在多個任務(wù)陷入阻塞的時候進(jìn)行切換,來保證一個線程在處理多個任務(wù)的時候總是在忙碌

⑥能夠更加充分的利用cpu,搶占更多的時間片

⑦無論是進(jìn)程還是線程都是由操作系統(tǒng)來切換的,開啟過多的線程、進(jìn)程會給操作系統(tǒng)的調(diào)度增加負(fù)擔(dān)

⑧如果我們是使用的協(xié)程,協(xié)程在程序之間的切換操作系統(tǒng)感知不到

⑨無論開啟多少個協(xié)程對操作系統(tǒng)來說總是一個線程在執(zhí)行,操作系統(tǒng)的調(diào)度不會有任務(wù)的壓力

⑩協(xié)程的本質(zhì)就是一條線程,所以完全不會產(chǎn)生數(shù)據(jù)安全的問題。

對于協(xié)程所需要用到的模塊主要有兩個,greenlet和gevent,其中g(shù)reenlet是gevent的底層邏輯模塊,主要控制協(xié)程的切換(手動),gevent可以當(dāng)做是greenlet的升級版,功能比greenlet更加全面,需要安裝,安裝后即可直接使用。

poYBAGL--vOAZ4vwAACPSqJkLSc706.png

pYYBAGL--vmAG9b7AACnPY5Q7bc444.png

可以看出,greenlet.switch可以幫助程序員手動切換阻塞,但是如果想要自動切換還需要用到gevent。

協(xié)程-gevent

gevent就是greenlet的完善版:

pYYBAGL--xiAKwhCAAB7_oR4tOc581.png

pYYBAGL--xyAS3_XAAFuvRBCWD8583.png

但是我們?nèi)绻裧event.sleep換成time.sleep呢?

pYYBAGL--0GAIE9bAAB_-F9bTi0348.png

poYBAGL--0aAQKthAAFmgOCzaOQ262.png

很明顯,阻塞沒有被識別到,所以我們需要用到導(dǎo)入monkey,這樣就能將一些常見的阻塞識別。

poYBAGL--2yARDGdAACiydKdiiA635.png

pYYBAGL--3OAHC2bAAFtL0x2oYk432.png




審核編輯:劉清




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

    關(guān)注

    0

    文章

    57

    瀏覽量

    6868
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    505

    瀏覽量

    19715
  • 信號量
    +關(guān)注

    關(guān)注

    0

    文章

    53

    瀏覽量

    8362
收藏 人收藏

    評論

    相關(guān)推薦

    Linux下進(jìn)程通訊之信號量

    ?信號量集,就是由多個信號量組成的一個數(shù)組。 作為一個整體, 信號量集中所有的信號量使用同一個等待隊列。 Linux 的信號量集為
    的頭像 發(fā)表于 08-19 19:55 ?2073次閱讀
    Linux下<b class='flag-5'>進(jìn)程</b>通訊之<b class='flag-5'>信號量</b>集

    FreeRTOS信號量使用教程

    信號量是操作系統(tǒng)中重要的一部分,信號量一般用來進(jìn)行資源管理和任務(wù)同步, FreeRTOS中信號量又分為二值信號量、 計數(shù)型信號量、互斥
    的頭像 發(fā)表于 12-19 09:22 ?3257次閱讀
    FreeRTOS<b class='flag-5'>信號量</b>使用教程

    信號量用法

    本帖最后由 chenshuihong 于 2016-4-22 11:28 編輯 信號量的分配,信號量的分配,信號量的分配,信號量的分配
    發(fā)表于 04-22 11:27

    LabVIEW信號量

    LabVIEW信號量信號量是一種用來限制可以同時取用共享(受保護(hù))資源的任務(wù)數(shù)量方法。受保護(hù)的資源或關(guān)鍵代碼部分可能包括寫入全局變量或與外部儀器進(jìn)行通信。您可以使用信號量使您的代碼線程
    發(fā)表于 04-09 21:52

    信號量機(jī)制怎么理解

    信號量(Semaphore),有時被稱為信號燈,是在多線程環(huán)境下使用的一種設(shè)施,是可以用來保證兩個或多個關(guān)鍵代碼段不被并發(fā)調(diào)用。在進(jìn)入一個關(guān)鍵代碼段之前,線程必須獲取一個
    發(fā)表于 11-14 09:23 ?2.6w次閱讀
    <b class='flag-5'>信號量</b>機(jī)制怎么理解

    你了解Linux 各類信號量

    內(nèi)核信號量與用戶信號量,用戶信號量分為POXIS信號量和SYSTEMV信號量,POXIS信號量
    發(fā)表于 05-04 17:19 ?2528次閱讀
    你了解Linux 各類<b class='flag-5'>信號量</b>?

    信號量和自旋鎖

    ------------------------------------------------------??? Linux中的信號量是一種睡眠鎖。如果有一個任務(wù)試圖獲得一個已被持有的信號量時,信號量會將其推入等待隊列,然后讓
    發(fā)表于 04-02 14:43 ?813次閱讀

    Linux IPC System V 信號量

    ?立即銷毀指定的信號量集,調(diào)用的進(jìn)程的的effective UID必須和信號量集的創(chuàng)建者或所有者相匹配,或者這個進(jìn)程有足夠的特權(quán)級別,此時第四個參數(shù)會被忽略IPC_INFO(Linux
    發(fā)表于 04-02 14:46 ?334次閱讀

    Linux 多線程信號量同步

    直到系統(tǒng)將資源分配給該進(jìn)程(進(jìn)入等待隊列,一直等到資源輪到該進(jìn)程)。V操作:如果在該信號量的等待隊列中有進(jìn)程在等待資源,則喚醒一個阻塞進(jìn)程;
    發(fā)表于 04-02 14:47 ?407次閱讀

    Linux信號量(2):POSIX 信號量

    上一章,講述了 SYSTEM V 信號量,主要運(yùn)行于進(jìn)程之間,本章主要介紹 POSIX 信號量:有名信號量、無名信號量。 POSIX
    的頭像 發(fā)表于 10-29 17:34 ?730次閱讀

    ThreadX(六)------信號量semaphore

    信號量semphere概述
    發(fā)表于 12-28 19:26 ?7次下載
    ThreadX(六)------<b class='flag-5'>信號量</b>semaphore

    使用二進(jìn)制信號量取代任務(wù)通知

    二進(jìn)制信號量只有0和1,兩個任務(wù)公用一個信號量,一個任務(wù)用于產(chǎn)生信號量(即對信號量+1),另一個任務(wù)使用此信號量(即對
    的頭像 發(fā)表于 09-15 09:22 ?883次閱讀

    FreeRTOS的二值信號量

    FreeRTOS中的信號量是一種任務(wù)間通信的方式,信號量包括:二值信號量、互斥信號量、計數(shù)信號量,本次實驗只使用二值
    的頭像 發(fā)表于 02-10 15:07 ?1526次閱讀

    Free RTOS的計數(shù)型信號量

    上篇講解了二值信號量,二值信號量只能判斷有無,而不能確定事件發(fā)生的次數(shù),因此我們?yōu)榱舜_定事件的次數(shù)引入了計數(shù)型信號量!
    的頭像 發(fā)表于 02-10 15:29 ?1051次閱讀
    Free RTOS的計數(shù)型<b class='flag-5'>信號量</b>

    使用Linux信號量實現(xiàn)互斥點燈

    信號量常用于控制對共享資源的訪問,有計數(shù)型信號量和二值信號量之分。初始化時信號量值大于1的,就是計數(shù)型信號量,計數(shù)型
    的頭像 發(fā)表于 04-13 15:12 ?826次閱讀
    使用Linux<b class='flag-5'>信號量</b>實現(xiàn)互斥點燈