用 Python 學 Server-Sent Events (SSE) — 以 Flask 實作為例
你有想過 sever 端要怎麼主動通知 client 端有事件發生或資料更新嗎?
除了 WebSocket 還有沒有其他做法呢?
一起看看 1 種稱為 Server-Sent Events 的技術吧!
Posted on May 21, 2024 in Python 程式設計 - 中階 by Amo Chen ‐ 5 min read
你有想過 sever 端要怎麼主動通知 client 端有事件發生或資料更新嗎?
除了 WebSocket 還有沒有其他做法呢?
一起看看 1 種稱為 Server-Sent Events 的技術吧!
Posted on May 21, 2024 in Python 程式設計 - 中階 by Amo Chen ‐ 5 min read
在學習網路程式設計時,每個人都遇過怎麼讓 sever 可以盡可能地處理更多連線的課題,要達到這個目的,多數人直覺應該會想到運用多執行緒、多 processes 的架構,為每個連線建立 1 個新的執行緒或 process 處理,但是這種方法在處理大量連線時,就顯得捉襟見肘,單就多執行緒的解決方案來說,隨著連線數上升,首先就會遇到 CPU context switch 所造成的效能問題,更遑論多 processes 架構會需要使用比多執行緒架構更多資源的問題。
但現代有很多應用僅用單執行緒就能夠處理龐大的連線數,包含 Nginx, Redis 等知名開源軟體,這些軟體是怎麼做到的呢?這就需要談到 1 種稱為 I/O multiplexing 的技術!
本文將教導 1 種稱為 I/O multiplexing 的技術,該技術能夠讓單執行緒處理多個連線,將效能壓榨出來!
p.s. 這個技術還可以與多執行緒、多 processes 架構混用
Posted on May 12, 2024 in Python 程式設計 - 中階 by Amo Chen ‐ 15 min read
Python 的 Iterable, Iterator 與 Generator 是經常會讓人產生混淆的事物,因為這 3 個都可以用 for
迴圈走訪,因此有些熟悉 Python 的面試官很喜歡問這 3 者之間的差異,追根究底是因為對這 3 者不熟悉的話,很容易寫出類似以下的低效率程式碼:
set([x for x in iterator])
本文將透過實際範例帶大家認識 Iterable, Iterator 與 Generator! 再也不搞混!
Posted on May 3, 2024 in Python 程式設計 - 中階 by Amo Chen ‐ 4 min read
Python 3.8 推出 1 個新的運算子 — Walrus Operator, 又稱海象運算子,其運算符號為 :=
。
Python 社群對海象運算子有一些爭議,主要是:
:=
與 =
符號太相似,難以快速識別但無論其爭議為何,海象運算子只用 1 個新的符號,就能使程式碼變得簡潔之外,還能同時滿足 Python 使用者的習慣,長遠來看其實是利大於弊。
譬如下列程式碼,在使用海象運算子之後,其實只需要 2 行即可:
x = input('> ')
while x:
print(x)
x = input('> ')
因此,學會適度使用海象運算子是可以帶來好處的!
本文將介紹海象運算子與幾個適合使用海象運算子的場景。
Posted on Apr 23, 2024 in Python 程式設計 - 中階 by Amo Chen ‐ 5 min read
本文將介紹 1 個相對少被提到的 operator 模組,該模組提供與 Python 各種運算子(operator)相對應的函式,適合喜歡 functional programming 的開發者使用,此外也有幾個高實用性的方法可以使用,不妨花一點點時間看看吧!
Posted on Apr 22, 2024 in Python 程式設計 - 中階 by Amo Chen ‐ 3 min read
談到 Python 數據分析的工具,多數人應該使用 Jupyter Notebook 搭配 pandas 進行數據分析,不過使用 pandas 還是不及使用 SQL 來得直覺一些,如果能夠在 Jupyter Notebook 中直接使用 SQL 對資料進行查詢、分析,對於精通 SQL 的人而言,將會減少需要額外學習 pandas 的成本。
恰好 JupySQL 是 1 個能夠讓我們在 Jupyter 以 SQL 對資料進行查詢、分析的擴充套件(extension),而且 JupySQL 也整合 pandas, 因此可以將查詢結果轉換成為 pandas 的 DataFrame, 除此之外更整合 DuckDB, SQLite, MySQL, PostgreSQL 等常見資料庫,讓我們能夠輕鬆以 SQL 操作各種不同來源的資料庫。
本文將以 Google Colab 搭配 JupySQL 與 DuckDB, 帶你學習 Jupyter Notebook + pandas 之外的另一種方法!
Posted on Apr 9, 2024 in Python 模組/套件推薦 , Python 程式設計 - 中階 by Amo Chen ‐ 5 min read
程式的效能並不是天生具備,而是榨出來的,特別是對於 Python 這門程式語言而言,如果想要做到 High Performance 的話,有些魔鬼就藏在細節裡。
舉常見的 list 為例,你知道 list 在執行 pop(0)
或 insert(0, value)
是效率較差的嗎?如果你的應用必須經常呼叫 pop(0)
或 insert(0, value)
的話,建議你換個資料結構吧!使用 deque 將會帶來效率的提升!
本文將帶你認識 Python 的 deque 以及它在何種特定情況下能夠帶來效率的提升!
Posted on Apr 1, 2024 in Python 程式設計 - 中階 by Amo Chen ‐ 4 min read
在使用 multiprocessing, threading 等模組跑平行處理時,如果需要在每個執行單位(process, thread)列印一些字串的話,你會怎麼做?
我想大多數人都直接 print()
到 terminal 就好,但是輸出的文字太多太長時,通常都沒有太大助益,這時候最好將輸出寫到檔案,一旦有問題就可以從檔案中尋找問題。
但是,我們多數時候還是想知道執行單位最新的運作狀態,例如正在執行哪個步驟,這些輸出一直附加到 terminal 上的話,不免還是會讓 terminal 顯得難看⋯⋯。
因此,本文將介紹 1 種方法讓平行處理的輸出可以清掉舊的輸出(output),並覆蓋新的輸出(output)上去,如此一來不僅可以知道每個執行單位的最新狀況,還可以讓 terminal 顯得乾淨、優雅!
Posted on Mar 13, 2024 in Python 程式設計 - 中階 by Amo Chen ‐ 2 min read