Table
一. Multi-processing 和Multi-threading 的優缺點:
- Multi-processing (多處理程序/多進程):
-
資料在彼此間傳遞變得更加複雜及花時間,因為一個 process 在作業系統的管理下是無法去存取別的 process 的 memory
- 適合需要 CPU 密集,像是迴圈計算
-
- Multi-threading (多執行緒/多線程):
- 資料彼此傳遞簡單,因為多執行緒的 memory 之間是共用的,但也因此要避免會有 Race Condition 問題
- 適合需要 I/O 密集,像是爬蟲需要時間等待 request 回覆
關於多執行緒在 Python 中受 GIL 的限制,推薦延伸閱讀:【Python教學】淺談 GIL & Thread-safe & Atomic operation
二. Multi-threading 使用方法:
Multi-threading 又稱多執行緒或多線程,其使用方法如下
▍安裝或引用套件:
使用 threading
模組,不用特別安裝即可使用,是 Python 標準函式庫裡面的模組。
▍設定介紹:
如下我們建立三個線程(t1 , t2 , t3),看要新增幾個可以再增加 t4,t5……
- target=main 就是在呼叫上面所寫的 main 主程式
- args = (url_list1,1) 是放你要給與 main 的參數
- t.start 這邊會依順序開始啟動線程
接下來就是跑跑看程式如果都沒有錯誤的話,恭喜你完成了第一隻 python 多線程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import threading import time def main(url, num): print('開始執行', url) time.sleep(2) print('結束', num) url_list1 = ['www.yahoo.com.tw, www.google.com'] url_list2 = ['www.yahoo.com.tw, www.google.com'] url_list3 = ['www.yahoo.com.tw, www.google.com'] # 定義線程 t_list = [] t1 = threading.Thread(target=main, args=(url_list1, 1)) t_list.append(t1) t2 = threading.Thread(target=main, args=(url_list2, 2)) t_list.append(t2) t3 = threading.Thread(target=main, args=(url_list3, 3)) t_list.append(t3) # 開始工作 for t in t_list: t.start() # 調整多程順序 for t in t_list: t.join() |
或是寫在 Class 類裡面:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import threading class Dosomething: def __init__(self): self.t_list = [] def dosomething(self, i): print('第' + str(i)) print('執行緒 ID:' + str(threading.get_ident())) def run(self): for i in range(5): self.t_list.append( threading.Thread(target=self.dosomething, args=(str(i)))) self.t_list[i].start() for i in self.t_list: i.join() if __name__ == "__main__": d = Dosomething() d.run() |
三. Multi-processing 使用方法:
Multi-processing 又稱多處理程序或多進程,其使用方法如下
▍安裝或引用套件:
使用 multiprocessing
模組,不用特別安裝即可使用,是 Python 標準函式庫裡面的模組。
▍設定介紹:
這邊建立三個多進程分別是 p1, p2, p3,可以再自行增加,寫法跟剛剛多線程其實只差在把 threading.Thread 換成 mp.Process,其他道理都相同,快開始試試看吧!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
import multiprocessing as mp import time def main(url, num): print('開始執行', url) time.sleep(2) print('結束', num) url_list1 = ['www.yahoo.com.tw, www.google.com'] url_list2 = ['www.yahoo.com.tw, www.google.com'] url_list3 = ['www.yahoo.com.tw, www.google.com'] # 定義線程 p_list = [] p1 = mp.Process(target=main, args=(url_list1, 2)) p_list.append(p1) p2 = mp.Process(target=main, args=(url_list2, 2)) p_list.append(p2) p3 = mp.Process(target=main, args=(url_list3, 2)) p_list.append(p3) # 開始工作 for p in p_list: p.start() # 調整多程順序 for p in p_list: p.join() |
或是寫在 Class 類裡面:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
import multiprocessing as mp import os class Dosomething: def __init__(self): self.p_list = [] def dosomething(self, i): print('第' + str(i)) print('多程序 ID:' + str(os.getpid())) def run(self): for i in range(5): self.p_list.append( mp.Process(target=self.dosomething, args=(str(i)))) self.p_list[i].start() for i in self.p_list: i.join() if __name__ == "__main__": d = Dosomething() d.run() |
最後~
▍關於與 Concurrency Programming 相關其他文章,可以參考:
- 【Python教學】淺談 Concurrency Programming
- 【Python教學】淺談 GIL & Thread-safe & Atomic
- 【Python教學】淺談 Multi-processing & Multi-threading 使用方法
- 【Python教學】淺談 Multi-processing pool 使用方法
▍關於 Async IO 相關其他文章,可以參考:
- 【Python教學】淺談 Coroutine 協程使用方法
- 【Python教學】Async IO Design Patterns 範例程式
- 【實戰篇】 解析 Python 之父寫的 web crawler 異步爬蟲
那 【爬蟲筆記】【Python教學】淺談 Multi-processing & Multi-threading 使用方法 的介紹就到這邊告一個段落囉!有任何問題可以在以下留言~
有關 Max行銷誌的最新文章,都會發佈在 Max 的 Facebook 粉絲專頁,如果想看最新更新,還請您按讚或是追蹤唷!
在〈【Python教學】淺談 Multi-processing & Multi-threading 使用方法〉中有 4 則留言
HI 版主你好
上列程式碼中,第三、十七行 有少空格喔
感謝分享
import threading
class Dosomething:
def__init__(self):
self.t_list = []
def dosomething(self, i):
print(‘第’ + str(i))
print(‘執行緒 ID:’ + str(threading.get_ident()))
def run(self):
for i inrange(5):
self.t_list.append(
threading.Thread(target=self.dosomething, args=(str(i))))
self.t_list[i].start()
for i inself.t_list:
i.join()
if __name__ == “__main__”:
d = Dosomething()
d.run()
嗨您好,
謝謝指正,已立即修正 🙂
還有第三十四行也是 少了空格
已經修復,感謝您 🙂
留言功能已關閉。