併發程式設計4

2022-08-29 13:03:28 字數 1069 閱讀 5748

1 gil

gil是乙個全域性直譯器鎖,是一種互斥鎖

乙個python.exe程序中只有乙份直譯器,如果職工程序開啟了多個執行緒都要執行**

多執行緒之間要競爭直譯器,一旦競爭就會出現問題

gil帶來的問題是同一時間只有乙個執行緒可以訪問直譯器

好處是保證了多執行緒的資料安全

thread-safe 執行緒安全,多個執行緒同時訪問也不會出現問題

not thread-safe 非執行緒安全,多個執行緒同時訪問可能出現問題

gc垃圾**

預設情況下乙個程序只有乙個執行緒,是不會出現問題的,但是不要忘記還有gc執行緒一旦出現多個執行緒就可能出現問題,所以當初就簡單粗暴的加上了gil鎖

由於有gil的存在即使有多個cpu也不可能真正的並行

應用程式分為兩種

io密集型  io操作較多,純計算較少  採用多執行緒

計算密集型  計算曹軍較多,io操作較少  採用多程序

當多執行緒需要共享乙個不屬於直譯器的資源時,必須要自己加鎖

2 執行緒池,程序池

池是一種容器

伺服器不可能無限的開執行緒,所以需要對執行緒數量加以控制,執行緒池就是幫我們封裝了執行緒數量的控制,以及執行緒的建立,銷毀,任務分配

程序池與執行緒池相同

特點:執行緒池在建立時不會立即開啟執行緒

等到提交任務時,如果沒有空閒執行緒並且已存在的執行緒數量小於最大值時,會新開一條執行緒

執行緒池中的執行緒開啟後就不會關閉了,直到程序全部結束

3 同步 非同步 阻塞 非阻塞

阻塞:程式執行過程中遇到io操作,無法繼續執行

非阻塞:程式正在執行中並且沒有遇到io操作,即使遇到io也不會阻塞,cpu不會切走

阻塞,非阻塞指的是程式的執行狀態

同步,非同步指的是發起任務的方式

同步:在發起任務後必須在原地等待,任務執行完畢才能繼續往下執行

非同步:在發起任務後立即繼續往下執行,不需要等待任務的執行結果

非同步效率高於同步

發起非同步任務的方式就是執行緒和程序

同步和阻塞時完全不同的:

阻塞一定是cpu已經切走了

同步雖然會卡住,但是cpu沒有切走還在你的程序中

併發程式設計(4)同步併發操作

一 主要涉及 等待事件 帶有期望的等待一次性事件 在限定時間內等待 使用同步操作簡化 二 等待乙個條件或者事件 1 選擇是在等待執行緒在檢查間隙,使用 std this thread sleep for 進行週期性的間歇 2 也是優先的選擇 是,使用c 標準庫提供的工具去等待事件的發生。通過另一線程...

Python併發程式設計4 程序池實現

必要性 程序的建立和銷毀過程消耗的資源較多 當任務量眾多,每個任務在很短時間內完成時,需要頻繁的建立和銷毀程序。此時對計算機壓力較大 程序池技術很好的解決了以上問題。原理建立一定數量的程序來處理事件,事件處理完進 程不退出而是繼續處理其他事件,直到所有事件全都處理完畢統一銷毀。增加程序的重複利用,降...

併發程式設計四(4) 執行緒同步 Condition

import threading import time def consumer cond with cond print consumer before wait cond.wait 等待消費 相當於程序就緒狀態 print consumer after wait def producer co...