Python 使用期物處理并發(使用concurrent.futures模塊啟動 進程)

使用concurrent.futures模塊啟動進程

concurrent.futures 模塊的文檔
(https://docs.python.org/3/library/concurrent.futures.html)副標題
是“Launching parallel tasks”(執行并行任務)。這個模塊實現的是真正
的并行計算,因為它使用 ProcessPoolExecutor 類把工作分配給多個
Python 進程處理。因此,如果需要做 CPU 密集型處理,使用這個模塊
能繞開 GIL,利用所有可用的 CPU 核心。

ProcessPoolExecutor 和 ThreadPoolExecutor 類都實現了通用的
Executor 接口,因此使用 concurrent.futures 模塊能特別輕松地把
基于線程的方案轉成基于進程的方案。

下載國旗的示例或其他 I/O 密集型作業使用 ProcessPoolExecutor 類
得不到任何好處。這一點易于驗證,只需把示例 17-3 中下面這幾行:

def download_many(cc_list):workers = min(MAX_WORKERS, len(cc_list))with futures.ThreadPoolExecutor(workers) as executor:

改成:

def download_many(cc_list):with futures.ProcessPoolExecutor() as executor:

對簡單的用途來說,這兩個實現 Executor 接口的類唯一值得注意的區
別是,ThreadPoolExecutor.__init__ 方法需要 max_workers 參
數,指定線程池中線程的數量。在 ProcessPoolExecutor 類中,那個
參數是可選的,而且大多數情況下不使用——默認值是
os.cpu_count() 函數返回的 CPU 數量。這樣處理說得通,因為對
CPU 密集型的處理來說,不可能要求使用超過 CPU 數量的職程。而對
I/O 密集型處理來說,可以在一個 ThreadPoolExecutor 實例中使用 10個、100 個或 1000 個線程;最佳線程數取決于做的是什么事,以及可
用內存有多少,因此要仔細測試才能找到最佳的線程數。

經過幾次測試,我發現使用 ProcessPoolExecutor 實例下載 20 面國
旗的時間增加到了 1.8 秒,而原來使用 ThreadPoolExecutor 的版本是
1.4 秒。主要原因可能是,我的電腦用的是四核 CPU,因此限制只能有
4 個并發下載,而使用線程池的版本有 20 個工作的線程。

ProcessPoolExecutor 的價值體現在 CPU 密集型作業上。我用兩個
CPU 密集型腳本做了一些性能測試。

arcfour_futures.py
這個腳本(代碼清單參見示例 A-7)純粹使用 Python 實現 RC4 算
法。我加密并解密了 12 個字節數組,大小從 149KB 到 384KB 不等。

sha_futures.py
這個腳本(代碼清單參見示例 A-9)使用標準庫中的 hashlib 模塊
(使用 OpenSSL 庫實現)實現 SHA-256 算法。我計算了 12 個 1MB 字
節數組的 SHA-256 散列值。

這兩個腳本除了顯示匯總結果之外,沒有使用 I/O。構建和處理數據的
過程都在內存中完成,因此 I/O 對執行時間沒有影響。

我運行了 64 次 RC4 示例,48 次 SHA 示例,平均時間如表 17-1 所示。
統計的時間中包含派生工作進程的時間。

表17-1:在配有Intel Core i7 2.7 GHz四核CPU的設備中,使用Python
3.4運行RC4和SHA示例,分別使用1~4個職程得到的時間和提速倍數可以看出,對加密算法來說,使用 ProcessPoolExecutor 類派生 4 個
工作的進程后(如果有 4 個 CPU 核心的話),性能可以提高兩倍。

對那個純粹使用 Python 實現的 RC4 示例來說,如果使用 PyPy 和 4 個職
程,與使用 CPython 和 4 個職程相比,速度能提高 3.8 倍。以表 17-1 中
使用 CPython 和一個職程的運行時間為基準,速度提升了 7.8 倍。

如果使用 Python 處理 CPU 密集型工作,應該試試
PyPy(http://pypy.org)。使用 PyPy 運行 arcfour_futures.py 腳本,速
度快了 3.8~5.1 倍;具體的倍數由職程的數量決定。我測試時使用
的是 PyPy 2.4.0,這一版與 Python 3.2.5 兼容,因此標準庫中有
concurrent.futures 模塊。

下面通過一個演示程序來研究線程池的行為。這個程序會創建一個包含
3 個職程的線程池,運行 5 個可調用的對象,輸出帶有時間戳的消息。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92104.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92104.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92104.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【系統全面】Linux內核原理——基礎知識介紹

理解內核:內核原理 計算機系統的軟件分層 不同于單片機中使用代碼直接與硬件交互,對于這種方式的缺點深有: (1)復雜度高,調用難度高,需要深入理解硬件的工作原理和細節。 (2&#xf…

Oracle自治事務——從問題到實踐的深度解析

一、引言:當“關鍵操作”遇上主事務的“生死綁定”?先問大家一個問題:假設你在開發一個用戶管理系統,核心功能是“用戶注冊”,同時需要記錄“操作日志”。某天,用戶提交注冊信息時,數據庫突然因磁盤空間不…

廣播(Broadcast)和組播(Multicast)對比

概述 廣播(Broadcast)和組播(Multicast)是計算機網絡中兩種重要的一對多通信方式,用于高效地將數據同時分發給多個接收者,它們的核心區別在于目標接收者的范圍和控制精度,基于業務對效率、規模和…

在 HTTP GET 請求中傳遞參數有兩種標準方式

方法 1:URL 查詢參數(Query Parameters)格式:?參數名值&參數名2值2示例請求http://localhost:8080/hello?name張三&age25后端接收方式GetMapping("/hello") public String sayHello(RequestParam String name…

pycharm windows/linux/mac快捷鍵

適用于mac的快捷鍵 適用于windows和linux的快捷鍵 參考資料: https://www.jetbrains.com/zh-cn/help/pycharm/mastering-keyboard-shortcuts.html

前端包管理工具深度對比:npm、yarn、pnpm 全方位解析

前言:為什么我們需要包管理工具? 在現代前端開發中,模塊化已成為標配。一個中型項目可能依賴數百個第三方包,手動管理這些依賴幾乎是不可能的任務。包管理工具應運而生,它們不僅解決了依賴安裝問題,還提供了…

調試Claude code的正確姿勢

隨著kimi k2的發布,Claude code的使用頻率愈發的頻繁,在發現moonshot官方提供了調試工具之后,我對claude code的交互過程愈發好奇。 moonpalace的安裝 官方moonpalace倉庫地址 go語言編寫,可以直接下載二進制二進制文件&#x…

【常見分布及其特征(5)】連續型隨機變量-連續均勻分布

概率密度函數(PDF)與概率質量函數(PMF)說明 基本概念區分 對于連續型隨機變量,通常使用 概率密度函數 (Probability Density Function, PDF) 進行描述;這與離散型隨機變量使用的 概率質量函數 (Probabili…

FAN-UNET:用于生物醫學圖像分割增強模型

目錄 一、論文結構概述 二、創新點詳解 三、創新點結構與原理 (1)Vision-FAN Block:全局與周期特征的融合引擎 (2)FANLayer2D:周期性建模的核心 四、代碼復現思路 五、仿真結果分析 (1&…

基于SpringBoot的籃球運動員體測數據分析及訓練管理系統論文

第1章 緒論 1.1 課題背景 互聯網發展至今,無論是其理論還是技術都已經成熟,而且它廣泛參與在社會中的方方面面。它讓信息都可以通過網絡傳播,搭配信息管理工具可以很好地為人們提供服務。所以各行業,尤其是規模較大的企業和學校等…

矩陣算法題

矩陣算法題1、矩陣置零2、螺旋矩陣3、旋轉圖像4、搜索二維矩陣1、矩陣置零 解題思路:這道題核心是要確定哪些行和哪些列要置零。所以定義兩個數組,一個記錄要置零的行,一個記錄要置零的列。遍歷整個矩陣,如果當前位置是0的話&…

Spring底層(二)Spring IOC容器加載流程原理

一、怎么理解SpringIoc IOC:Inversion Of Control,即控制反轉,是一種設計思想。之前對象又程序員自己new自己創建,現在Spring注入給我們,這樣的創建權力被反轉了。 所謂控制就是對象的創建、初始化、銷毀。 創建對象…

UDP中的單播,多播,廣播

文章目錄UDP 簡單回顧一、單播(Unicast)定義特點應用舉例二、廣播(Broadcast)定義特點應用三、多播(Multicast)定義特點應用UDP 單播、廣播、多播的對比總結額外說明代碼簡要示例(C)…

數據庫練習3

一、建立product表,操作方式operate表要求:1.定義觸發器實現在產品表(product)中每多一個產品,就在操作表(operate)中記錄操作方式和時間以及編號記錄。注:操作說明:標記執行delete 、insert、 update2.定義觸發器實現在產品表(pr…

pycharm和anaconda安裝,并配置python虛擬環境

1、pycharm和anaconda安裝 PyCharm與Anaconda超詳細安裝配置教程_anaconda pycharm安裝-CSDN博客https://blog.csdn.net/qq_32892383/article/details/116137730 2、pycharm漢化 PyCharm漢化:簡單兩步搞定!PyCharm怎么設置中文簡體,為什么…

EP04:【Python 第一彈】函數編程

一、定義 函數指將一組語句的集合通過一個變量名封裝起來,調用這個函數變量名,就可以執行函數。 二、特點 減少重復邏輯代碼的編寫將程序中的邏輯可以進行擴展維護項目程序的代碼更簡單 三、創建 def 函數名():邏輯代碼1邏輯代碼2return 結果 函數名…

linux安裝Mysql后添加mysql的用戶和密碼

在 MySQL 中創建用戶并設置密碼的完整指南如下: 方法 1:使用 CREATE USER 語句(推薦) -- 創建新用戶并設置密碼 CREATE USER newuserlocalhost IDENTIFIED BY your_password;-- 授予權限(示例:授予所有數據…

React hooks——memo

一、簡介React.memo 是 React 提供的一個高階組件(Higher-Order Component),用于優化函數組件的渲染性能,它通過淺比較(shallow compare)props 的變化來決定是否重新渲染組件。1.1 基本用法const MyCompone…

leetcode15.三數之和題解:邏輯清晰帶你分析

介紹 題源 分析 1.雙指針固定一個數 首先明白一點,我們有三個數,我們想使用雙指針,那就必須固定一個數。 2.二分 本題還涉及二分,雙指針經常和二分結合使用(二分本質就是雙指針,仔細思考這思考這句話&…

exports使用 package.json字段控制如何訪問你的 npm 包

目錄 想象一下你正在開發一個 npm 包…… 術語 什么是exports領域? exports好處 保護內部文件 多格式包 將子路徑映射到dist目錄 子路徑導出 單一入口點 多個入口點 公開軟件包文件的子集 有條件出口 設置使用條件 默認條件 句法 針對 Node.js 和瀏…