用 Python resource 模組找出尖峰記憶體用量


Python 先天的設計使然,所以 Python 相較起其他語言(如 Rust, Go 等)更加耗用記憶體,如果是簡單的 Python 程式(例如自動化腳本)基本不需要太在意記憶體的問題,但如果是需要計較運算資源成本的應用場景,例如使用 AWS, GCP 雲端服務等, Python 的記憶體耗用肯定會對總體花費造成影響,因此了解你的應用使用記憶體的情形是相當重要的一步。

如果要優化記憶體的使用,可先從盤點尖峰記憶體的用量著手,除了可以避免使用等級過高的運算資源之外,還可以針對尖峰用量最大的應用優先降低用量。

Python 也提供內建的 resource 模組可使用,讓開發者可以設定系統資源的使用限制(例如 CPU time, heap size, nice 值 等等),也可以讀取系統資源使用的情況,其中就包含尖峰記憶體(peak memory)用量的資訊。

Docker multistage builds 教學


Docker 映像檔(image)大小在 production 環境中也是相當重要的一環。

如果 Docker 映像檔太大,不僅佔用傳輸頻寬,也會拉長部署(deployment)的時間,因此如何優化 Docker 映像檔案大小是一門重要課題。

優化 Docker 映像檔大小有若干種方法,其中一種為 multistage build, 不過 Docker 官方文件所提供的 multistage builds 範例卻無法正常運作,本篇將修正該範例並實際體驗 multistage builds 的效果。

用 grep 搭配正規表示式擷取字串


grep 是長春實用的指令,每當需要從大量日誌(log)/資料中找出含特定字串的資料行時, grep 無疑是你的好幫手。

不過 grep 會將符合條件的資料行整行列出,因此如果只想要擷取符合的字串,就需要結合正規表示式(regular expression)中的幾個方法。

大家來寫 AIOHTTP client


Python 知名套件 requests 一直是每位 Python 應用開發者在開發 HTTP client 的首選,不過該套件原生並不支援 asyncio, 無法受益於 asyncio 在 I/O 方面高效率的優點,因此如要增加使用 requests 的效率,通常會搭配 multiprocessingthreading 模組,透過平行(concurrent)處理提高同一時間能夠執行 HTTP 要求的數量。

所幸我們仍有 AIOHTTP 可以使用,該套件不僅提供與 requests 套件相同的功能,更原生支援 asyncio, 因此可以在不使用 multiprocessingthreading 模組的情況下,就能夠達到相當高的執行效率,如果想透過 asyncio 提高 HTTP client 的效能,不妨考慮使用 AIOHTTP 吧!

本文將透過實際範例學習如何使用 AIOHTTP 實作 HTTP client, 建議需有 asyncio 的基礎再閱讀本文為佳。

Python asyncio shield 函式說明


前陣子研究 asyncio 模組時,恰好看到其中 1 個函式 wait_for() ,該函式在 coroutine 超過時限時,會將其取消(cancel),不過 asyncio 也有提供 1 個函式能夠保護 task 被取消,該函式為 shield() ,官方文件對於 shield() 函式的說明為:

Protect an awaitable object from being cancelled .

簡而言之,能夠防止 awaitables(coroutines, Tasks, Futures) 物件被取消。

不過,實際上該怎麼使用,官方文件並沒有著墨太多,因此本文將實際透過幾個範例摸索如何使用 shield() .

Python asyncio 從不會到上路


自從 Python 3.4 推出 asyncio 模組之後,開發者在提升 Python 程式效能的解決方案上又多了 1 種選擇。

不過相較於較為人所熟知的 multiprocessingthreading 而言,大多數初學者並不習慣非同步式(asynchronous)式的開發思維,但只要能夠掌握 asyncio 模組中幾點重要的概念,即使是從未接觸過的初學者,也能夠慢慢掌握 asyncio 的使用方式。

本文將重點介紹 asyncio 模組中的重要概念,並透過實際範例理解 asyncio 的運作,從而學會如何使用 asyncio 模組。

Elasticsearch 用 random_score 進行隨機抽樣


Elasticsearch 中存放大量的資料(或稱文件 document)時,一般難以片刻就遍訪每 1 筆資料,如果是為了驗證資料格式,或者需要資料進行實驗,此情況下可選擇用抽樣的方式進行,不僅可利用抽樣的方式預估整個資料庫的情況,也可以有效率地以部分資料進行實驗。

本文記錄如何以 function_score 結合 random_score 進行隨機抽樣。

Python multiprocessing 模組進階說明與範例


先前 Python multiprocessing 模組簡單說明與範例 一文簡述 multiprocessing 模組中 Pool, Manager 的使用方法,也講述如何在多個 Processes 之間共享資料,不過仍有許多關於 multiprocessing 中的功能尚未詳述,例如 Process 類別(class), Queue, Pipe 等等,這些功能不僅重要也很實用,是邁向 Python 高階功能的必學項目,因此不可忽視。

本文將透過實際範例了解更多關於 multiprocessing 模組中實用的功能。

12321