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)
點擊複製文章連結
X