Python自定義線程池,這么高效,是不是開了掛?

目錄

1、線程池基礎 ???

1.1 線程池概念與優勢

1.2 Python標準庫concurrent.futures簡介

示例代碼:使用ThreadPoolExecutor執行簡單任務

2、利用ThreadPoolExecutor定制 ???

2.1 創建自定義線程池類

示例代碼:自定義ThreadPoolExecutor子類

2.2 設置線程池參數與任務提交

示例代碼:配置線程池并提交任務

2.3 錯誤處理與結果回調

示例代碼:使用add_done_callback處理異常

3、從零開始實現線程池 ??

3.1 設計線程池架構

3.2 實現任務隊列與工作線程

任務隊列實現

工作線程實現

3.3 線程同步與安全控制

4、集成異步IO與線程池 ??

4.1 asyncio與線程池混用技巧

示例代碼:混合使用asyncio與ThreadPoolExecutor

4.2 提升I/O密集型任務性能

示例代碼:異步并發下載網頁

4.3 實戰案例:并發下載與處理

示例代碼:并發下載圖片并轉換為灰度

5、優化與監控策略 ??

5.1 動態調整線程池大小

示例代碼:基于任務隊列長度動態調整線程池

5.2 監控線程池狀態與性能指標

實施方案:

5.3 日志記錄與異常報警

示例代碼:集成日志記錄與異常處理

6、總結 ??



1、線程池基礎 ???

1.1 線程池概念與優勢

線程池是一種軟件設計模式,用于管理多個線程的創建、執行、銷毀等生命周期 ,從而提高程序性能與資源利用率。它預先創建一定數量的工作線程并保持就緒狀態 ,當有任務到達時 ,線程池會從隊列中取出任務并分配給空閑線程執行 ,執行完畢后線程不會立即銷毀而是回到池中等待下一輪任務。這一機制有效減少了頻繁創建和銷毀線程的開銷,提升了系統的響應速度和吞吐量。

優勢包括:

  • 資源高效:減少線程創建與銷毀的開銷。

  • 控制并發:通過線程池大小限制并發任務數,防止資源過度消耗。

  • 管理便利:統一調度任務,便于監控與控制。

  • 提升響應:復用已有線程,加快任務處理速度。

1.2 Python標準庫concurrent.futures簡介

concurrent.futures模塊自Python 3.2起被引入,為異步執行提供了高層次的接口,包括兩種主要的執行器:ThreadPoolExecutor用于多線程并發,而ProcessPoolExecutor則用于多進程。對于自定義線程池的需求,ThreadPoolExecutor是理想的起點。

ThreadPoolExecutor允許開發者輕松創建線程池,提交任務 ,并獲取結果,支持同步等待(result())和異步獲取結果(add_done_callback()), 提供了異常處理機制以及對任務完成情況的追蹤。

示例代碼:使用ThreadPoolExecutor執行簡單任務

下面是一個使用ThreadPoolExecutor的示例,展示了如何創建一個線程池,提交任務,并獲取結果。

import concurrent
from concurrent.futures import ThreadPoolExecutor
import timedef long_running_task(n):"""模擬耗時操作"""time.sleep(n)return f"Task {n} done after {n} seconds."# 創建一個包含4個線程的線程池
with ThreadPoolExecutor(max_workers=4)as executor:# 提交任務到線程池futures ={executor.submit(long_running_task, n)for n in range(5)}# 收集結果
for future in concurrent.futures.as_completed(futures):print(future.result())

此段代碼中,long_running_task模擬了一個耗時操作,通過線程池提交了5個這樣的任務。每個任務在完成后打印其結果,由于線程池最大工作者數為4,因此前四個任務會立即開始執行 ,最后一個任務會在某個線程釋放后繼續。

請注意,實際應用中應根據具體需求調整線程池大小及任務細節。

2、利用ThreadPoolExecutor定制 ???

2.1 創建自定義線程池類

為了更好地控制線程池的行為,我們可以創建一個自定義的ThreadPoolExecutor子類。這不僅允許我們覆蓋默認行為,還能添加額外的功能,如更詳細的日志記錄、錯誤處理策略以及線程池狀態的監控。

示例代碼:自定義ThreadPoolExecutor子類

下面的代碼展示了如何創建一個自定義的ThreadPoolExecutor子類 ,其中增加了初始化時的參數驗證以及更豐富的日志記錄功能。

from concurrent.futures import ThreadPoolExecutor
import loggingclass CustomThreadPoolExecutor(ThreadPoolExecutor):def __init__(self, max_workers=None, thread_name_prefix='', initializer=None, initargs=()):if max_workers is None or max_workers <=0:raise ValueError("max_workers must be greater than 0")super().__init__(max_workers=max_workers,thread_name_prefix=thread_name_prefix, initializer=initializer,initargs=initargs)self.logger = logging.getLogger(__name__)self.logger.setLevel(logging.INFO)def submit(self, fn, *args, **kwargs):future =super().submit(fn,*args,**kwargs)self.logger.info(f"Submitted task: {fn.__name__} with args: {args} and kwargs: {kwargs}")return future# 使用自定義線程池執行任務
with CustomThreadPoolExecutor(max_workers=4, thread_name_prefix="CustomThread")as executor:futures =[executor.submit(pow, base, exponent)for base, exponent in[(2,10),(3,5)]]
for future in futures:print(f"Result: {future.result()}")

輸出:

Result: 1024
Result: 243

 

在這個示例中,我們首先檢查max_workers是否有效,然后初始化父類ThreadPoolExecutor。我們還設置了一個logger,用于記錄任務的提交情況。submit方法被重寫 ,以便在任務提交時記錄相關信息。

2.2 設置線程池參數與任務提交

在創建線程池時,可以通過參數max_workers來指定線程池中的最大線程數。此外,還可以通過thread_name_prefix來設置線程名前綴,便于調試和日志分析。

示例代碼:配置線程池并提交任務

下面的代碼示例展示了如何配置線程池并提交多個任務,同時展示了如何使用as_completed函數來獲取已完成的任務結果。

from concurrent.futures import ThreadPoolExecutor, as_completeddef calculate_factorial(number):factorial =1for i in range(1, number +1):factorial *= ireturn factorialwith ThreadPoolExecutor(max_workers=5)as executor:tasks =[executor.submit(calculate_factorial, n)for n in range(1,6)]for future in as_completed(tasks):result = future.result()
print(f"The factorial of {future._args[0]} is {result}")

這個示例中 ,我們定義了一個calculate_factorial函數來計算階乘,然后使用ThreadPoolExecutor創建了一個包含5個線程的線程池。我們提交了5個任務,分別計算1到5的階乘 ,并使用as_completed來迭代并打印出每個任務的結果。

2.3 錯誤處理與結果回調

在處理

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

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

相關文章

四.iOS核心動畫 - 圖層的視覺效果

引言 在前幾篇博客中我們討論了圖層的frame,bounds,position以及讓圖層加載圖片。但是圖層事實上不僅可以顯示圖片&#xff0c;或者規則的矩形塊&#xff0c;它還有一系列內建的特性來創建美麗優雅的頁面元素。在這篇博客中我們就來探索一下CALayer的視覺效果。 視覺效果 圖…

java筆記(29)——動態代理(工廠模式)【示例】

文章目錄 動態代理&#xff08;工廠模式&#xff09;接口類實體類代理類測試類 動態代理&#xff08;工廠模式&#xff09; 接口類 package com.itchen.proxytest;public interface Star {public abstract String sing(String name);public abstract void dance(); }實體類 …

轉化分析|一位數據分析師的實驗田復盤

花3個月時間&#xff0c;吭哧吭哧寫了80頁草稿的《投資——1. 知己知彼》&#xff0c;發布之前豪言壯語“2000閱讀量”&#xff0c;到現在累計72&#xff0c;真是piapia打臉&#xff01;心態那個崩啊&#xff01;&#xff01; 朋友們吐槽內容太長、定位不明確、分析深度不夠&am…

手持式雷達流速儀的工作原理

TH-LS5手持式雷達流速儀基于雷達技術和多普勒效應進行工作。它發射一束微波信號到水體表面&#xff0c;當信號遇到水流時&#xff0c;會發生多普勒頻移。發射器發出的高頻電磁波信號(通常是微波信號)遇到流體后&#xff0c;部分信號會被反射回來。接收器接收到反射回來的信號&a…

開發一套java語言的智能導診需要什么技術?java+ springboot+ mysql+ IDEA互聯網智能3D導診系統源碼

開發一套java語言的智能導診需要什么技術&#xff1f;java springboot mysql IDEA互聯網智能3D導診系統源碼 醫院導診系統是一種基于互聯網和3D人體的智能化服務系統&#xff0c;旨在為患者提供精準、便捷的醫院就診咨詢服務。該系統整合了醫院的各種醫療服務資&#xff1b;智慧…

android gradle開發與應用(-)基礎

Gradle 是一個強大的自動化構建工具&#xff0c;廣泛用于多種編程語言和平臺&#xff0c;尤其是在 Android 應用開發中。Android Studio&#xff0c;作為官方的 Android 開發環境&#xff0c;使用 Gradle 作為其構建系統。了解 Gradle 的基礎對于有效地管理和構建 Android 項目…

【機器學習】機器學習與醫療健康在疾病預測中的融合應用與性能優化新探索

文章目錄 引言第一章&#xff1a;機器學習在醫療健康中的應用1.1 數據預處理1.1.1 數據清洗1.1.2 數據歸一化1.1.3 特征工程 1.2 模型選擇1.2.1 邏輯回歸1.2.2 決策樹1.2.3 隨機森林1.2.4 支持向量機1.2.5 神經網絡 1.3 模型訓練1.3.1 梯度下降1.3.2 隨機梯度下降1.3.3 Adam優化…

【你也能從零基礎學會網站開發】(了解)關系型數據庫的基本架構體系結構與概念理解

&#x1f680; 個人主頁 極客小俊 ?&#x1f3fb; 作者簡介&#xff1a;程序猿、設計師、技術分享 &#x1f40b; 希望大家多多支持, 我們一起學習和進步&#xff01; &#x1f3c5; 歡迎評論 ??點贊&#x1f4ac;評論 &#x1f4c2;收藏 &#x1f4c2;加關注 關系型數據庫的…

【第五節】C/C++數據結構之圖

目錄 一、圖的基本概念 1.1 圖的定義 1.2 圖的其他術語概念 二、圖的存儲結構 2.1 鄰接矩陣 2.2 鄰接表 三、圖的遍歷 3.1 廣度優先遍歷 3.2 深度優先遍歷 四、最小生成樹 4.1 最小生成樹獲取策略 4.2 Kruskal算法 4.3 Prim算法 五、最短路徑問題 5.1 Dijkstra算…

INFINI Easysearch嘗鮮Hands on

INFINI Easysearch 是一個分布式的近實時搜索與分析引擎&#xff0c;核心引擎基于開源的 Apache Lucene。Easysearch 的目標是提供一個自主可控的輕量級的 Elasticsearch 可替代版本&#xff0c;并繼續完善和支持更多的企業級功能。 與 Elasticsearch 相比&#xff0c;Easysear…

熊貓燒香是什么?

熊貓燒香&#xff08;Worm.WhBoy.cw&#xff09;是一種由李俊制作的電腦病毒&#xff0c;于2006年底至2007年初在互聯網上大規模爆發。這個病毒因其感染后的系統可執行文件圖標會變成熊貓舉著三根香的模樣而得名。熊貓燒香病毒具有自動傳播、自動感染硬盤的能力&#xff0c;以及…

上海市計算機學會競賽平臺2023年5月月賽丙組最大子陣和

題目描述 給定 &#x1d45b;&#x1d45b;nn 個整數組成一個方陣 &#x1d44e;&#x1d456;,&#x1d457;ai,j?&#xff0c;請找一個 &#x1d458;&#x1d458;kk 的子方陣&#xff0c;使得子方陣內的數字之和達到最大&#xff0c;輸出這個最大值。 輸入格式 第一行&…

vue 組件下 img 標簽動態傳入不展示

效果 解決辦法&#xff1a; require() <titleComponent:title"業務工作概覽":src"require(/assets/imgs/evaluation/overviewStatistics.png)"></titleComponent> 效果&#xff1a;

Github 上 Star 數最多的大模型應用基礎服務 Dify 深度解讀(一)

背景介紹 接觸過大模型應用開發的研發同學應該都或多或少地聽過 Dify 這個大模型應用基礎服務&#xff0c;這個項目自從 2023 年上線以來&#xff0c;截止目前&#xff08;2024-6&#xff09;已經獲得了 35k 多的 star&#xff0c;是目前大模型應用基礎服務中最熱門的項目之一…

ss命令詳細使用講解文章

ss 命令作為 iproute2 軟件包的一部分&#xff0c;是Socket Statistics的縮寫&#xff0c;也稱為IPC&#xff08;Inter-process Communication&#xff09;套接字統計 ss命令用于顯示sockets&#xff08;套接字&#xff09;的狀態。與netstat類似&#xff0c;但它通常提供更詳…

WebKit 簡介及工作流程探秘

在探索現代互聯網世界的奧秘時&#xff0c;瀏覽器引擎是不可或缺的一環&#xff0c;而 WebKit 正是其中的佼佼者。WebKit&#xff0c;這個開源的瀏覽器渲染引擎&#xff0c;以其卓越的性能和廣泛的支持度&#xff0c;成為了 Safari、早期的 Chrome 以及其他眾多瀏覽器的核心。本…

【筆試記錄】華為 | 20230823 | cpp

獲取連通的相鄰節點列表 題目描述 在網元內&#xff0c;存在了 N 個轉發節點&#xff0c;每個轉發節點有自己唯一的標識 TB 且每個節點有 M 個端口&#xff0c;節點間通過端口進行報文通訊。出于業務隔離的需求&#xff0c;服務器內的端口被劃分為多個通訊平面(用 VLAN 隔離&…

取消lfs, 使用原始文件上傳的辦法

查詢當前倉庫使用lfs的文件&#xff0c;然后刪除 git lfs ls-files 刪除lfs文件后&#xff0c;提交commit git add . git commit -m"remove lfs file" 查詢本地lfs配置 git config --local --list 重置本地lfs配置 git config --unset filter.lfs.smudgegit co…

從0到1搭建微服務框架

目錄 1.技術棧&#xff1a; 2.模塊介紹: 3.關鍵代碼講解 3.1基礎公共模塊(common)依賴&#xff1a; 3.3授權模塊(auth)依賴: 3.4授權模塊核心配置類(AuthrizatonConfig): 3.4 SecurityConfig.java 3.5 bootstrap的核心配置文件(其他服務配置類似這個)&#xff1a; 3.6n…

防爆巡檢終端在石化工廠安全保障中的應用

防爆巡檢終端在石化工廠安全保障中的應用是廣泛而關鍵的&#xff0c;其設計旨在確保在易燃易爆環境中進行安全、有效的巡檢工作。以下是防爆巡檢終端在石化工廠安全保障中的詳細應用描述&#xff1a; 1. 環境監測與預警 防爆巡檢終端配備了各種傳感器&#xff0c;能夠實時監測…