併發程式設計技術 Python高階

2022-08-22 18:33:09 字數 1625 閱讀 9450

併發任務處理,即同時執行多個任務,可以採用如下幾種方案實現:

1.多程序,即建立多個程序,每個程序(其實是程序中的主線程)負責執行乙個任務,由於多個程序可以同時執行,所以就可以實現併發任務處理

2,多執行緒:即建立多個執行緒,每個執行緒負責執行乙個任務,由於多個執行緒可以同時執行,所以就可以實現併發任務處理

3.多程序+多執行緒,即建立多個程序,並且每個程序中建立多個執行緒

程序(process):正在執行的程式,或程式的一次執行過程,通過pid唯一標識,它是作業系統分配資源(比如記憶體空間,cpu資源,i/o資源,pid資源)的基本單位,作業系統會給每個程序分配一塊獨立的虛擬私有位址空間,程序之間不能互訪,所以程序間通訊(ipc: inter-process communication)比較麻煩

執行緒(thread):程序內部的一條執行路徑,通過tid唯一標識,執行緒是屬於程序的,每個程序至少要有乙個執行緒(即主線程),主線程可以建立其他多個普通執行緒,它是作業系統呼叫執行的基本單位,執行緒具有優先順序的屬性,優先順序高的執行緒優先呼叫執行。乙個程序內部的所有執行緒共享程序的所有資源,所以建立乙個新執行緒的開銷很小,速度很快。執行緒間相互通訊也很容易實現

在單核cpu系統上,多個執行緒分時復用cpu(以時間片為單位),在某一時刻,其實只有乙個執行緒在執行,其它執行緒都在等待,但由於cpu時間片很短,所以巨集觀上看來,多個執行緒在同時執行。而在多核cpu系統上,在某一時刻確實有多個執行緒在同時執行

在python中,通過使用標準庫中的threading和_ thread模組實現程序管理,_thread模組實現了底層的執行緒管理功能,threading模組封裝了 _thread模組,即在它基礎上實現的,提供的介面更好用,所以我們通常使用threading模組

兩種建立執行緒的方式:

2.子類化thread,並重寫run方法,在run方法中指定執行緒要執行的**

當多個執行緒同時對共享資源進行訪問時,特別是修改操作,比如對全域性變數進行修改,對同乙個檔案進行寫操作,要進行加鎖控制(使用threading.lock類),保證互斥進行

可以使用訊號量物件(threading semaphore)控制多個執行緒同步進行

死鎖問題

global interpreter lock,全域性直譯器鎖,在cpython直譯器中,由於存在gil機制,乙個程序中的多個執行緒在某一時刻,只能有乙個在執行python**,即獲得gil鎖的那個執行緒,在它執行完100條節碼後就會暫停執行並釋放gil鎖,其他處於暫停狀態的執行緒又有乙個可以獲得gil鎖而繼續執行,所以多執行緒無法充分利用多核機器的計算資源,如果想提公升程式在多核機器上的效能,可以使用多程序(因為每個程序都有乙個獨立的gil)、編寫c 擴充套件、使用其他python直譯器。

使用標準庫multiprocessing模組實現

multiprocessing建立的子程序執行的是我們自己的程式,而subprocess建立的子程序

擴充套件1.呼叫join方法主線程會阻塞

2.每個執行緒都有個執行緒函式,當執行緒執行時就會執行那個執行緒函式

3.真正執行任務的是執行緒,程序是不能執行**的,只有執行緒有執行**的能力

4.執行緒也稱為輕量級的程序

5.高併發:同時有很多人連線到伺服器,並同時處理

6.只要是有限的都是一種資源

7.記憶體位址的對映轉換

8.核心越多能執行的程序越多

8核cpu可以同時執行8個程序

高階程式設計技術(Python)作業5

5 9 處理沒有使用者的情形 在為完成練習5 8編寫的程式中,新增一條if 語句,檢查使用者名稱列表是否為空。如果為空,就列印訊息 we need to find some users 刪除列表中的所有使用者名稱,確定將列印正確的訊息。solution users if users for user...

高階程式設計技術(Python)作業7

書上寫了sublime無法執行使用者互動的 事實上只要安裝乙個repl就可以進行使用者互動了。但是repl並沒有辦法進行死迴圈的跳出處理,所以一旦 出現死迴圈,sublime就會失去響應,只能關閉sublime。而不使用repl正常執行python就可以使用ctrl c中斷死迴圈但是又不能進行使用者...

高階程式設計技術作業 5

題目描述 使用乙個for迴圈列印數字1 20 包含 展示 for number in range 1,21 print number input null output 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 題目描述 通過給函式rang...