物件池模式主要適用於下列應用程式場景:
資源受限的場景。例如,不需要可擴展性的環境(CPU、記憶體等實體資源有限),CPU效能不夠強勁,記憶體比較緊張,垃圾收集,記憶體抖動會造成比較大的影響,需要提高記憶體管理效率, 響應性比吞吐量更為重要。
在記憶體中數量受限的物件。
建立成本高的物件。
大量的存活期短且初始化成本低的物件池化,以降低記憶體分配和再分配成本,避免記憶體碎片。
Python 的這樣的動態語言,GC 是依靠引用技術來保證物件不會過早的回收,某些場景下可能出現雖然創建了但是沒人使用的空閒期,導致物件被回收了。可以委託給物件池來保管。
Pond 介紹
Pond 是一個Python 中高效率的通用物件池,具有效能好、記憶體佔用小、命中率高的特點。基於近似統計的根據頻率自動回收的能力,能夠自動調整每個物件池的空閒物件數量。
因為目前 Python 目前沒有比較好的、測試使用案例完整、程式碼註解完整、文件完善的物件池化函式庫,同時目前的主流物件庫也沒有比較智慧的自動回收機制。
Pond 可能是 Python 中第一個社群公開的測試案例完整,覆蓋率 90% 以上、程式碼註解完備、文件完善的物件池化函式庫。
Pond 靈感來自 Apache Commons Pool、Netty Recycler、HikariCP、Caffeine,集合了多家的優點。
其次 Pond 透過使用近似計數的方式以極小的記憶體空間統計每個物件池的使用頻率,並且自動回收。
流量較隨機平均的情況下,預設策略和權重可以降低 48.85% 記憶體佔用,借取命中率 100%。
流量較為符合 2/8 定律的情況下,預設策略和權重可以降低 45.7% 記憶體佔用, 借取命中率 100%。
設計概述
Pond 主要由 FactoryDict、Counter、PooledObjectTree 三部分以及一個單獨的回收執行緒構成。
FactoryDict
使用 Pond 需要實作物件工廠 PooledObjectFactory,PooledObjectFactory 提供物件的建立、初始化、銷毀、驗證等操作,由 Pond 呼叫。
所以為了讓物件池支援存放完全不同的對象,Pond 使用了一個字典來記錄每個工廠類別的名稱和自己實現的工廠類別的實例化物件。
每個 PooledObjectFactory 應該具備建立物件、銷毀物件、驗證物件是否還可用、重置物件四個功能。
比較特別的是Pond 支援自動重置對象,因為某些場景下可能會存在對像中要先賦值進行傳遞,傳遞完又被回收的情況,為了避免污染建議這種場景下無比實現這個功能。
Counter
Counter 中儲存了一個近似計數器。
PooledObjectTree
PooleedObjectTree 是個字典,每個 key 對應一個先進先出的佇列,這些佇列都是執行緒安全的。
每個佇列中保存著多個 PooleedObject。 PooledObejct 保存了建立時間、最後借出的時間以及實際需要的物件。
線程安全性
Pond 的借用和回收都是線程安全的。 Python 的 queue 模組提供了一個適用於多執行緒程式設計的先進先出(FIFO)資料結構。它可以用來安全地在生產者和消費者線程之間傳遞訊息或其他資料。
鎖定是呼叫者來處理的,所有多個執行緒能夠安全且容易的使用相同的 Queue 實例工作。而 Pond 的借用和回收都是在操作 queue,所以基本上可以認為是線程安全的。
借出機制
在使用Pond 借出一個物件時,會先檢查想要藉用的物件的種類是否已經在PooledObjectTree 存在,如果存在會檢查這個物件的物件池是否為空,如果為空會建立一個新的。
如果物件池中有多餘的對象,會利用 queue 彈出一個物件並驗證這個物件是否可用。如果不可用會自動呼叫所屬的 Factory 清理銷毀該對象,同時清理它在 Python 中的 GC 計數,讓它更快被 GC 回收,不斷拿取下一個直至有可用的。
如果這個物件可用,則會直接傳回。當然無論是從對像池中取出對象還是新創建了一個對象,都會利用 Counter 增加一個計數。
回收機制
回收一個物件時會判斷目標物件池存不存在,如果存在會檢查物件池是否已經滿了,滿了的話會自動銷毀要歸還的這個物件。
然後會檢查這個物件是否已經被借出太長時間,如果超過了配置的最長時間同樣會被清理掉。
自動回收
自動回收時每隔一段時間,預設是 300 s,就會執行一次。自動清理不經常使用的物件池中的物件。
使用說明
你可以先安裝 Pond 的函式庫並且在你的專案中引用。
pip install pondpond
from pond import Pond, PooledObjectFactory, PooledObject
首先你需要聲明一個你想要放入的類型的物件的工廠類,例如下面的例子我們希望池化的物件是Dog,所以我們先聲明一個PooledDogFactory 類,並且實作PooledObjectFactory。
class Dog: name: str validate_result:bool = True class PooledDogFactory(PooledObjectFactory): def creatInstantce(self) -> PooledObject: dog = Dog() dog.name = "puppy" return PooledObject(dog) def destroy(self, pooled_object: PooledObject): del pooled_object def reset(self, pooled_object: PooledObject) -> PooledObject: pooled_object.keeped_object.name = "puppy" return pooled_object def validate(self, pooled_object: PooledObject) -> bool: return pooled_object.keeped_object.validate_result
接著你需要建立Pond 的物件:
pond = Pond(borrowed_timeout=2, time_between_eviction_runs=-1, thread_daemon=True, eviction_weight=0.8)
Pond 可以傳遞一些參數進去,分別代表:
borrowed_timeout :單位為秒,借出對象的最長期限,超過期限的物件歸還時會自動銷毀不會放入物件池。
time_between_eviction_runs :單位為秒,自動回收的間隔時間。
thread_daemon :守護線程,如果為 True,自動回收的線程會隨著主線程關閉而關閉。
eviction_weight :自動回收時權重,會將這個權重與最大使用頻次想乘,使用頻次小於這個值的物件池中的物件都會進入清理步驟。
實例化工廠類別:
factory = PooledDogFactory(pooled_maxsize=10, least_one=False)
所有繼承了 PooledObjectFactory 都會自帶建構函數,可以傳遞 pooled_maxsize 和 least_one 兩個參數。
pooled_maxsize:這個工廠類別產生的物件的物件池的最大能放置的數量。
least_one:如果為 True,在進入自動清理時,這個工廠類別產生的物件的物件池會至少保留一個物件。
向Pond 註冊這個工廠對象,預設會使用factory 的類別名稱作為PooledObjectTree 的key :
pond.register(factory)
當然你也可以自訂它的名字,名字會作為PooledObjectTree 的key:
pond.register(factory, name="PuppyFactory")
註冊成功後,Pond 會自動根據factory 中設定的pooled_maxsize 自動開始建立物件直到填滿這個物件池。
借用和歸還物件:
pooled_object: PooledObject = pond.borrow(factory) dog: Dog = pooled_object.use() pond.recycle(pooled_object, factory)
當然你可以用名字來進行借用和歸還:
pooled_object: PooledObject = pond.borrow(name="PuppyFactory") dog: Dog = pooled_object.use() pond.recycle(pooled_object, name="PuppyFactory")
完全清理一個物件池:
pond.clear(factory)
透過名字清理一個物件池:
pond.clear(name="PuppyFactory")
正常情況下,你只需要使用上面的這些方法,生成物件和回收物件都是全自動的。
以上是高效率的Python通用物件池化函式庫怎麼使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

每天學習Python兩個小時是否足夠?這取決於你的目標和學習方法。 1)制定清晰的學習計劃,2)選擇合適的學習資源和方法,3)動手實踐和復習鞏固,可以在這段時間內逐步掌握Python的基本知識和高級功能。

Python在Web開發中的關鍵應用包括使用Django和Flask框架、API開發、數據分析與可視化、機器學習與AI、以及性能優化。 1.Django和Flask框架:Django適合快速開發複雜應用,Flask適用於小型或高度自定義項目。 2.API開發:使用Flask或DjangoRESTFramework構建RESTfulAPI。 3.數據分析與可視化:利用Python處理數據並通過Web界面展示。 4.機器學習與AI:Python用於構建智能Web應用。 5.性能優化:通過異步編程、緩存和代碼優

Python在開發效率上優於C ,但C 在執行性能上更高。 1.Python的簡潔語法和豐富庫提高開發效率。 2.C 的編譯型特性和硬件控制提升執行性能。選擇時需根據項目需求權衡開發速度與執行效率。

Python在現實世界中的應用包括數據分析、Web開發、人工智能和自動化。 1)在數據分析中,Python使用Pandas和Matplotlib處理和可視化數據。 2)Web開發中,Django和Flask框架簡化了Web應用的創建。 3)人工智能領域,TensorFlow和PyTorch用於構建和訓練模型。 4)自動化方面,Python腳本可用於復製文件等任務。

Python在數據科學、Web開發和自動化腳本領域廣泛應用。 1)在數據科學中,Python通過NumPy、Pandas等庫簡化數據處理和分析。 2)在Web開發中,Django和Flask框架使開發者能快速構建應用。 3)在自動化腳本中,Python的簡潔性和標準庫使其成為理想選擇。

Python的靈活性體現在多範式支持和動態類型系統,易用性則源於語法簡潔和豐富的標準庫。 1.靈活性:支持面向對象、函數式和過程式編程,動態類型系統提高開發效率。 2.易用性:語法接近自然語言,標準庫涵蓋廣泛功能,簡化開發過程。

Python因其簡潔與強大而備受青睞,適用於從初學者到高級開發者的各種需求。其多功能性體現在:1)易學易用,語法簡單;2)豐富的庫和框架,如NumPy、Pandas等;3)跨平台支持,可在多種操作系統上運行;4)適合腳本和自動化任務,提升工作效率。

可以,在每天花費兩個小時的時間內學會Python。 1.制定合理的學習計劃,2.選擇合適的學習資源,3.通過實踐鞏固所學知識,這些步驟能幫助你在短時間內掌握Python。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

Atom編輯器mac版下載
最受歡迎的的開源編輯器

Dreamweaver Mac版
視覺化網頁開發工具