Python的協程,執行緒,程序的理解及實現

2021-08-18 01:48:16 字數 1153 閱讀 9906

1,程序

解釋略常用庫-mutiprocessing

2,執行緒

解釋略常用庫-threading,threadpool

thread庫因為存在主線程會優先於子執行緒結束的問題,產品開發時不建議使用

另,因為cpython全域性解釋鎖(gil)的原因,多個執行緒之間不是並行處理的,所以不算是純意義上的多執行緒,但是也不失為一種提高效率的解決方式,所以cpython環境中是不存在嚴格的平行計算的,無法利用多核,但是jpython中沒有全域性解釋鎖的限制,可惜jpython不是主流,各種包的支援略顯不足。。。

3,協程

解釋:採用非阻塞排程方式實現的子例程,這種處理方式所用的記憶體較少,效率比較高

首先明確下同步/非同步阻塞/非阻塞的概念:

同步/非同步:針對於通訊而言,指請求端傳送請求後,是否等待接收端返回,同步等待,非同步不等待;

阻塞/非阻塞:針對於事務排程而言,指事務排程時,如排程時間過長,阻塞排程方式會掛起,等到排程完成後再獲取cpu進行後續排程,非阻塞排程不會存在掛起操作,直接處理後續排程,等其他排程完成後再轉回來繼續處理;

可能阻塞/非阻塞的一時不太好理解,舉個例子就明白了:

假設超市一堆顧客排隊結算,有人掃碼結算,有人現款結算(排程時間又長有短),櫃檯遇到現金結算時,顧客要掏錢包拿錢,這個時間比較長,櫃檯等待顧客掏錢,然後收錢找零,完成後再繼續處理後面的顧客結算,那這個處理方式就是阻塞排程,現金顧客掏錢的這段時間,櫃檯是一直處於等待的狀態(掛起),這個等待狀態在現金顧客拿出錢後結束(獲取cpu);整個顧客佇列的處理完成時間是各個顧客處理時間之和;

後來櫃檯換了一種結算方式,遇到現金顧客了,這個顧客先在一邊掏錢,櫃檯記憶這個顧客的狀態(壓進堆疊),然後處理後面的掃碼結算的顧客,等現金顧客拿出現金後再收現金找零,然後再按照這個規律處理後面的顧客結算,這種方式就是非阻塞排程,由此可見,整個佇列的處理時間最有可能就是現金顧客的結算時間;

常用庫-greenlet、asyncio、tornado、aiohhttp

程序、執行緒、協程的實現:

後續補充

Python的程序 執行緒 協程

作業系統處理任務,排程單位是程序和執行緒。程序 表示乙個程式的執行活動 開啟程式 讀寫程式資料 關閉程式 執行緒 執行某個程式時,該程序排程的最小執行單位 執行功能1,執行功能2 乙個程式至少有乙個程序,乙個程序至少有乙個執行緒。並行 需要處理的任務數 cpu核心數量 兩個任務,兩個核心 任務1 任...

Python 程序 執行緒 協程

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

Python 程序,執行緒, 協程

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