當前位置: 妍妍網 > 碼農

Python升級之路( Lv27) 並行編程初識

2024-03-13碼農

Python系列文章目錄


第二十二章 GUI圖形界面編程之選單

第二十三章 GUI圖形界面編程之GUI程式編寫實踐

第二十四章 Pygame遊戲開發基礎(上)

第二十五章 Pygame遊戲開發基礎(下)

第二十六章 基於pygame 實作的坦克大戰

第二十七章 並行編程初識


  • Python系列文章目錄

  • 前言

  • 什麽是並行編程

  • 序列 & 並列 & 並行

  • 序列

  • 並行

  • 並列

  • 行程 & 執行緒 & 協程

  • 行程

  • 執行緒

  • 協程

  • 同步 & 異步

  • 同步

  • 異步


  • 前言

    大家好, 我是了不起, 歡迎收看我的冒險之旅

    今天我們將學習並行編程涉及的幾個概念, 包括 cpu執行任務的三種方式: 序列, 並列, 並行. 程式的三種存在形式: 行程, 執行緒, 協程 以及相關衍生概念. 再加上 訊息通訊的兩種方式: 同步, 異步

    今日冒險片段上

    傳說暗黑城的盡頭每次都會自動改變路徑,許多前輩進入這裏再也沒有出來,暗影迷宮因此得名。了不起從蜘蛛洞穴深入到迷宮後,便發覺這裏到處充滿了陰森和恐懼。由於長期生活在陰暗潮濕的環境中,精靈們發生了變異,這些類似於人形的上位精靈不但各種內容增強了許多,就連智商也在逐漸與人類接近。
    眼看著就要突破迷宮的出口,三道黑影突然閃現在勇士的面前,嘴裏還嘟囔著:「就憑你們也想活著走出這裏?先過了我這關再說吧。」說話的這位就是暗影迷宮的領主——影子劍士剎影,邊上兩位毫無疑問就是這裏的將領了。身為阿拉德大陸的冒險家們自然不會因為這句話就膽怯,一場戰鬥一觸即發,俗話說的好「明槍易躲,暗箭難防!」這個強悍的影子劍士居然會鬼劍士的所有技能,什麽鬼影步、鬼斬、冰霜薩亞,十分棘手,更可恨是,那兩位將領狩魂者和莫比一個不停的在遠處釋放回旋鏢,一個在暗處安放地雷,著實令人頭疼

    什麽是並行編程

    序列 & 並列 & 並行

    序列

    一句話概: 一個CPU上,按順序完成多個任務

    序列圖解:

    並行

    一句話概括: 一個cpu上, 交替執行多個任務

    並行圖解:

    並列

    一句話概括: 多個cpu上, 同時執行多個任務(任務數<=CPU核數) 並列必須有多cpu才能實作,否則只能實作並行(偽並列)

    並列圖解:

    序列, 並列, 並行總結如下:

  • 序列: 一個CPU上,按順序完成多個任務

  • 並列: 多個cpu上, 同時執行多個任務(任務數<=CPU核數)

  • 並行: 一個cpu上, 交替執行多個任務

  • 行程 & 執行緒 & 協程

    行程

    行程是資源(CPU、記憶體等)分配的基本單位,它是程式執行時的一個例項. 程式執行時系統就會建立一個行程,並為它分配資源,然後把該行程放入行程就緒佇列,行程排程器選中它的時候就會為它分配CPU時間,程式開始真正執行.

    行程的優點:

  • 可以使用電腦多核,進行任務的並列執行,提高執行效率

  • 執行不受其他行程影響,建立方便

  • 空間獨立,數據安全

  • 行程的缺點:

  • 行程的建立和刪除消耗的系統資源較多

  • 執行緒

    執行緒是程式執行時的最小單位,也是CPU排程和分派的基本單位. 一個行程可以由很多個執行緒組成,擁有自己獨立的棧和共享的堆,共享堆,不共享棧,標準執行緒由作業系統排程. 執行緒由CPU獨立排程執行,在多CPU環境下就允許多個執行緒同時執行. 同樣多執行緒也可以實作並行操作,每個請求分配一個執行緒來處理.

    多執行緒 多執行緒可以理解為在同一個程式中能夠同時執行多個不同的執行緒來執行不同的任務,這些執行緒可以同時利用CPU的多個核心執行. 多執行緒編程能夠最大限度的利用CPU的資源: 如果某些執行緒不需要占用CPU時間片時, 可以讓出當前時間片, 讓其他執行緒獲取到CPU資源. 以此來達到最大限度利用CPU資源的目的. 這個過程也被成為上下文切換.

    執行緒生命周期 執行緒主要有「**新建」(NEW)、「就緒」(RUNNABLE)、「執行」(RUNNING)、「阻塞」(BLOCKED)、「死亡」(DEAD)**** 五種狀態. 各狀態間的轉換如下圖所示: 註意事項:

  • 在執行過程中,執行緒 由就緒態(RUNNABLE )轉為非就緒態(BLOCKED )的過程就是執行緒上下文切換

  • 執行緒的狀態由執行轉為阻塞 ,再由阻塞轉為就緒 ,然後再被排程器選中執行,這就是一個上下文切換的過程

  • 當一個執行緒從執行狀態轉為阻塞狀態時,我們稱為一個執行緒的暫停,執行緒暫停被切出之後,作業系統會保存相應的上下文,以便這個執行緒稍後再次進入就緒狀態時能夠在之前執行進度的基礎上繼續執行

  • 當一個執行緒從阻塞狀態進入到就緒狀態時,我們稱為一個執行緒的喚醒,此時執行緒將獲取上次保存的上下文繼續完成執行

  • 頻繁的上下文切換會帶來系統開銷, 因此會導致系統效能下降. 所以我們在使用多執行緒是應該盡量避免出現上下文切換.

  • 協程

    協程也叫作纖程(Fiber),是一種線上程中,比執行緒更加輕量級的存在,由程式設計師自己寫程式來管理. 我們可以 將協程理解為執行線上程上的程式碼塊 , 協程掛起並不會引起執行緒阻塞, 他的作用是提高執行緒的利用率.. 協程之間可以依靠信箱來進行通訊和數據共享, 了避免記憶體共享數據而帶來的執行緒安全問題. 因為其輕量和高利用率的特點, 即使建立上千個執行緒也不會對系統造成很大負擔, 而執行緒則恰恰相反. 協程是一種設計思想,不僅僅局限於某一門語言. 在Go, Java, Python 等語言中均有實作

    協程的核心(控制流的讓出和恢復)

  • 每個協程有自己的執行棧,可以保存自己的執行現場

  • 可以由使用者程式按需建立協程(比如:遇到io操作)

  • 協程「主動讓出(yield)」執行權時候,會保存執行現場(保存中斷時的寄存器上下文和棧),然後切換到其他協程

  • 協程恢復執行(resume)時,根據之前保存的執行現場恢復到中斷前的狀態,繼續執行,這樣就透過協程實作了輕量的由使用者態排程的多工模

  • 行程和執行緒之間的區別

    1. 每個行程都有獨立的程式碼和數據空間(行程上下文),行程間的切換會有較大的開銷.

    2. 執行緒可以看成是輕量級的行程,屬於同一行程的執行緒共享程式碼和數據空間,每個執行緒有獨立的執行棧和程式計數器(PC),執行緒切換的開銷小.

    3. 執行緒和行程最根本的區別在於:行程是資源分配的單位,執行緒是排程和執行的單位.

    4. 多行程: 在作業系統中能同時執行多個任務(程式).

    5. 多執行緒: 在同一應用程式中有多個順序流同時執行.

    6. 執行緒是行程的一部份,所以執行緒有的時候被稱為輕量級行程.

    7. 一個沒有執行緒的行程是可以被看作單執行緒的,如果一個行程內擁有多個執行緒,行程的執行過程不是一條線(執行緒)的,而是多條線(執行緒)共同完成的.

    8. 系統在執行的時候會為每個行程分配不同的記憶體區域,但是不會為執行緒分配記憶體(執行緒所使用的資源是它所屬的行程的資源),執行緒組只能共享資源.

    執行緒, 行程, 協程之間區別如圖所示:

    同步 & 異步

    同步和異步強調的是訊息通訊機制

    同步

    同步(synchronous):A呼叫B,等待B返回結果後,A繼續執行. 在同步的過程中, 存在一個等待的狀態. 即: 某個事情執行時需要等待另一個個事情的結果, 才能繼續向下執行.

    以打電話為例: A向B打電話時, 發出電話邀請, 只有B同意接聽之後才會進行通話, 否則會一直處於等待狀態(阻塞). 這一過程稱為同步.

    異步

    異步(asynchronous ):A呼叫B,A繼續執行,不等待B返回結果;B有結果了,通知A,A再做處理.

    以發簡訊為例: A在給B發訊息, 無需等待B的反饋, 便可以給C發訊息. 這一過程成為異步.

    今日冒險片段下

    在這千鈞一發之際, 了不起突然想到了之前奧菲利亞送的卷軸. 利用這個卷軸可以召喚精靈王伊莎貝拉的虛影, 並存在一段時間. 於是二人便利用精靈王的虛影拖住影子劍士剎影, 先將實力較弱的狩魂者和莫比擊敗, 然後在三對一的情況下, 花費接近一天的時間, 艱難的將這個劍士擊敗. 在未來的某一刻, 想到這裏, 他們肯定會自豪, 因為他們擊敗的是一個能自由穿梭時空的職業, 並精通鬼劍士四系職業的第五職業——暗黑武士. 就這樣, 擊敗領主剎影之後, 了不起也順利的晉升到了lv28.

    Sora最近老火了,Sora 的出現會對短視訊、廣告、遊戲、影視行業等產業格局一定會被重塑,目前 Sora 還沒正式開放註冊,大家看到的使用體驗大部份都來自官網,或者少部份的使用者分享。

    為了避免更多讀者受騙,我們直接給大家整了一個免費的。

    註意是下面【 Python都知道 】公眾號,不是本公眾號,點選下方的公眾號卡片,然後回復【 sora ,即可獲取最新 Sora 的最全資料。


    目前已經分享了,如何申請 Sora 的內測,以及最新關於 Sora 的技術特點,使用教程、變現機遇等等。

    大家如果想領取這份資料,可以點選下方的公眾號卡片,然後回復 sora ,即可獲取最新 Sora 的最全資料。

    需要提醒大家的是,Sora 目前還沒有完全開放,任何市面上付費的一些課程,都請大家謹慎選擇。

    可以確定的是:未來 10-20年,一定是 AI 的大風口、大時代,如果錯過了公眾號、錯過了抖音、錯過了小紅書。

    請一定不要錯過 AI +。

    面對浪潮,恐懼只會讓我們佇立在原地,被巨浪吞噬。

    要去主動適應它,不被恐懼束縛,動起胳膊動起腳,才不會被淘汰。

    註意是下面【 Python都知道 】公眾號,不是本公眾號,點選下方的公眾號卡片,然後回復 【 sora ,即可獲取最新 Sora 的最全資料。