Python的程序 執行緒 協程

2022-08-18 18:15:13 字數 1687 閱讀 3170

作業系統處理任務,排程單位是程序執行緒

程序:表示乙個程式的執行活動(開啟程式、讀寫程式資料、關閉程式)

執行緒:執行某個程式時,該程序排程的最小執行單位(執行功能1,執行功能2)

乙個程式至少有乙個程序,乙個程序至少有乙個執行緒。

並行:需要處理的任務數 == cpu核心數量

兩個任務,兩個核心

任務1:-------------

任務2:-------------

併發:需要處理的任務數 > cpu核心數量

三個任務,乙個核心

任務1: ----- ------

任務2: ------

任務3: ------

多程序、多執行緒

表示當前程式可以同時執行多個任務

程序和執行緒都是由作業系統排程完成。

共享意味著多個執行緒的競爭,會導致不安全問題。

為了保護記憶體空間的資料不被多個執行緒同時讀寫,導致資料隱患,於是誕生了"互斥鎖"。

"互斥鎖":一種安全有序的讓多個執行緒訪問程序記憶體空間的機制。

當乙個執行緒在訪問程序記憶體空間時,互斥鎖可以防止其他執行緒訪問

解釋型語言:執行程式時,直譯器按行執行程式內容,執行時檢查問題。

編譯型語言:通過編譯器將程式編譯為乙個可執行檔案,執行前檢查問題。

gil(全域性直譯器鎖):同一時刻只能有乙個執行緒在執行。

壞處:多執行緒不能充分利用多核cpu資源。

好處:從根本上杜絕了多執行緒訪問記憶體空間的安全問題。

python的多執行緒不適合並行,但非常適合併發。

python的多執行緒在遇到 io阻塞函式執行,會自動釋放gil,讓後面的執行緒執行任務。

如果沒有 io 操作,那麼直譯器會每隔100次操作後,強制釋放gil,讓後面的執行緒執行。

import sys

sys.getcheckinterval()

適用於密集cpu任務,可以充分排程cpu資源(大量的並行運算)。

multiprocessing

缺點:不適用於需要大量資料通訊和多次切換的場景,因為程序之間通訊和切換成本高。
適用於密集io任務(網路io,磁碟io,資料庫io),在io阻塞時可以切換執行緒執行。

threading.thread、multiprocessing.dummy

缺點:同乙個cpu時間片只能執行乙個任務,不能做到並行,只能做到併發。

優點:執行緒之間切換和通訊非常方便,開銷小。

由程式設計師自行編寫排程功能,切換協程就好比切換乙個函式,幾乎沒有切換開銷。

特點是在單執行緒上執行多個任務,排程由程式設計師控制,不經過作業系統,所以沒有程序執行緒的切換開銷,也不需要處理鎖。

gevent

monkey.patch_all()

monkey的作用是將python底層的網路庫socket、select自動打個補丁,程式在遇到網路io阻塞時,可以自動切換協程工作。(該補丁不適用於本地io)

優點:協程任務是基於使用者的,不經過作業系統,執行效率極高。

缺點:單執行緒執行,不能處理 cpu密集任務,和密集本地io任務。

Python 程序 執行緒 協程

程序和執行緒之間的關係 執行緒是屬於程序的,執行緒執行在程序空間內,同一程序所產生的執行緒共享同一記憶體空間,當程序退出時該程序所產生的執行緒都會被強制退出並清除。執行緒可與屬於同一程序的其它執行緒共享程序所擁有的全部資源,但是其本身基本上不擁有系統資源,只擁有一點在執行中必不可少的資訊 如程式計數...

Python 程序,執行緒, 協程

程序是系統進行資源分配和排程的乙個獨立單位 最小單位 程序的幾個狀態 空 新建 建立執行乙個程式的新程序,可能的事件有 新的批處理作業 互動登入 終端使用者登入到系統 作業系統因為提供一項服務而建立 由現有的程序派生等。新建 就緒 作業系統準備好再接納乙個程序時,把乙個程序從新建態轉換為就緒態。就緒...

程序 執行緒 協程

多程序多執行緒的最終目地都是為了加快任務處理的時間,但是受限於cpu核數 只有多核才能實現並行,任務耗時 單核任務耗時 cpu核數 那麼在單核上執行多程序多執行緒是不是沒有用了,加快不了處理的速度了?答案肯定是不是的,不然這個東西設計出來太雞肋了,那它們加快處理的原理是什麼呢?乙個程序耗時 b程序耗...