WeHelp
Python Threading 多執行緒程式入門
2024-01-09 21:24:42
## 程序與執行緒 Process and Thread 我們一般撰寫的 Python 程式,在執行的時候,作業系統會產生一個程序 Process,用來管理執行階段的執行狀態和相關資源。 在現代的運算系統中,每個程序 Process 都會包含一到多個執行緒 Thread,平常如果沒有特別的撰寫執行緒相關的程式邏輯,那麼每個程序 Process 就至少會包含一個主執行緒 Main Thread,用來按照程式邏輯的順序,把每個程式指令依序執行完成。 ---- ## 多執行緒程式開發 Multithreading 那為什麼我們可能會需要撰寫多執行緒的程式呢?至少有兩個具體的情境,說明如下: - 如果程式中包含需要等待的 I/O 操作,例如網路連線。單一執行緒的程式,就會被網路連線的速度卡住。意思是,單一執行緒的程式,同一時間只能進行一次網路連線,並須等到前一個連線完成,才能進行下一個。如果是多執行緒的程式,就可以讓每個執行緒同時進行網路連線的操作不需要互相等待。 - 如果程式中包含非常大量的運算,使用多執行緒的程式,將運算切割分配給不同的執行緒來處理,就能有效的運用多核心 CPU 的每個核心,同時進行運算。 ---- ## 多執行緒程式範例 Example 在 Python 程式中,我們可以使用 threading 這個模組中的 Thread 類別,來建立、管理執行緒的運作。範例如下: ``` python import urllib.request def parsePage(src): req=urllib.request.Request(src, headers={ "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" }) response=urllib.request.urlopen(req) # print(response.read().decode("utf-8")) 印出原始碼 print("爬取網頁結束", src) from threading import Thread # 建立兩個執行緒,指定任務為爬取特定的網站頁面 # 透過 target 和 args 定義要執行的函式和參數 thread1=Thread(target=parsePage, args=["https://www.ptt.cc/bbs/movie/index.html"]) thread2=Thread(target=parsePage, args=["https://www.ptt.cc/bbs/MLB/index.html"]) # 使用 start 方法啟動執行緒 thread1.start() thread2.start() # 使用 join 方法讓主程式等待執行緒完成 print("主程式等待執行緒運作中") thread1.join() thread2.join() print("主程式結束") ``` 若我們使用單一執行緒程式來爬取兩個網頁,必須等待第一個網頁爬取完成之後,才能繼續爬取第二個網頁。而以上程式利用兩個執行緒,同時爬取兩個網頁內容,加快整體程式的反應速度,這就是多執行緒程式的實際效益。關於多執行緒平行運作的觀念,可以參考以下流程說明圖: ![image](wehelp-storage://7598db13acc94e6bb5498177639bc80e)