python並行程式設計 介紹篇

2021-08-28 17:51:52 字數 1827 閱讀 4514

介紹篇

執行緒篇程序篇

非同步篇gpu篇

分布式篇

任務分解:將程式分解為任務,在不同處理器上執行以實現並行化。(可以使用以下兩種方法)

任務分配:將任務分配到各個處理器上 (目的是負載均衡

聚集:將小任務與大任務合併到一起從而改進效能的過程

如果任務數量遠遠超過可用的處理器數量,由於執行緒切換等其它因素會導致效率降低

如果計算機有針對大量小任務而進行特別的設計,如採用gpu計算,那將能從大量小任務的執行中獲益

對映:指定哪個任務將要執行 (目標是將總執行時間降到最低)(可以使用以下2中策略,這2個策略間由於是衝突的,需要做出權衡)

注意!對映問題,即np完備2

。對於相同大小的任務,很容易直接對映

如果是每個任務的工作量千差萬別,就需要採用負載均衡演算法在執行期間確定聚集與對映的策略。

如果在程式執行期間通訊量或任務量發生變化的情況,可以使用動態的負載均衡演算法

(不同的問題存在多種負載均衡演算法,有全域性或區域性的。全域性演算法需要全域性的掌握,會增加大量成本。區域性演算法只依賴於特定任務本身的資訊,不過難以找到最優)

(存在 管理者/執行者(管理者排程)、層次化的管理者/執行者(分組,每組都有個管理者排程)、去中心化的模型(每個處理器會維護自己的任務池))

多執行緒比多程序成本低,但效能更低

注意!無論程序,還是執行緒多了以後,他們的排程也會消耗較多的cpu資源

一般來說,乙個程序可以包含多個並行執行緒。不過,python直譯器並非完全是執行緒安全的。為了支援多執行緒的python程式,會使用名為全域性直譯器鎖gil(global interpreter lock)的全域性鎖。這意味著在同一時刻只有乙個執行緒會執行python**。(如果多個執行緒嘗試訪問同乙個物件資料,那麼它可能處於不一致的狀態)

故此,python中的並行程式設計想要發揮多核的優勢推薦使用多程序代替多執行緒

為什麼不去除gil? 更多細節:python 最難的問題

由於python自身存在gil的問題,同一時刻只能執行乙個執行緒,在一些實驗對比中,我們會發現python中程序與執行緒之間的差異,在這裡直接給出結論

對比操作:cpu密集型io密集型網路請求密集型

多執行緒

多程序

故cpu密集型、io密集型操作,首選多程序,網路請求密集型選擇多執行緒

(附:如果追求效率,cpu密集型操作應首選c/c++語言

io密集型操作,cpu消耗很少,換用c/c++也很難得到效率的提公升,應採用開發效率高的語言,指令碼語言是首選)

更多細節:python中單執行緒、多執行緒和多程序的效率對比實驗

參考書籍:《python並行程式設計手冊》 ↩︎ ↩︎

參考:追溯到最早的一篇2023年的頁面已失效了 ↩︎

Python 並行程式設計 多執行緒

最近看了一下 python並行程式設計手冊 雖然這本書薄薄的,包含內容挺多,但是有很多地方講的不清楚,而且有一些bug出現,講道理不推薦看這本書,但是我也隨手翻完了,也寫著玩,總結一下python並行程式設計,順便寫一寫書裡有問題的地方。這本書的問題過多,不建議閱讀!尤其是mpi4py之後的內容。棄...

python並行程式設計學習之緒論

電腦科學的研究,不僅應該涵蓋計算處理所基於的原理,還因該反映這些領域目前的知識狀態。當今,計算機技術要求來自電腦科學所有分支的專業人員理解計算機處理的基礎的關鍵,在於知道軟體和硬體在所有層面上的互動。直到現在,程式設計師可以依賴於硬體設計者,編譯器和晶元廠商,來使他們的軟體程式執行更快或者更有效,而...

python並行化介紹及使用 Pool

本篇將要介紹python的並行化,及簡單的應用。主要介紹map函式的使用,一手包辦了序列操作 引數傳遞和結果儲存等一系列的操作。首先是引入庫 from multiprocessing.dummy import pool pool pool 4 results pool.map 爬取函式,列表 本文將...