05 Python 爬蟲教學10 所有文章

【Python教學】淺談 Multi-processing & Multi-threading 使用方法

python_threading_processing

一. Multi-processing 和Multi-threading 的優缺點:

  • Multi-processing (多處理程序/多進程):
    1. 資料在彼此間傳遞變得更加複雜及花時間,因為一個 process 在作業系統的管理下是無法去存取別的 process 的 memory
    2. 適合需要 CPU 密集,像是迴圈計算
  • Multi-threading (多執行緒/多線程):
    1. 資料彼此傳遞簡單,因為多執行緒的 memory 之間是共用的,但也因此要避免會有 Race Condition 問題
    2. 適合需要 I/O 密集,像是爬蟲需要時間等待 request 回覆

關於多執行緒在 Python 中受 GIL 的限制,推薦延伸閱讀:【Python教學】淺談 GIL & Thread-safe & Atomic operation

二. Multi-threading 使用方法:

Multi-threading 又稱多執行緒或多線程,其使用方法如下

▍安裝或引用套件:

使用 threading模組,不用特別安裝即可使用,是 Python 標準函式庫裡面的模組。

▍設定介紹:

如下我們建立三個線程(t1 , t2 , t3),看要新增幾個可以再增加 t4,t5……

  1. target=main 就是在呼叫上面所寫的 main 主程式
  2. args = (url_list1,1) 是放你要給與 main 的參數
  3. t.start 這邊會依順序開始啟動線程

接下來就是跑跑看程式如果都沒有錯誤的話,恭喜你完成了第一隻 python 多線程

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 類裡面:

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()

三. Multi-processing 使用方法:

Multi-processing 又稱多處理程序或多進程,其使用方法如下

▍安裝或引用套件:
使用 multiprocessing模組,不用特別安裝即可使用,是 Python 標準函式庫裡面的模組。

▍設定介紹:
這邊建立三個多進程分別是 p1, p2, p3,可以再自行增加,寫法跟剛剛多線程其實只差在把 threading.Thread 換成 mp.Process,其他道理都相同,快開始試試看吧!

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 類裡面:

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 相關其他文章,可以參考:

▍關於 Async IO 相關其他文章,可以參考:

那 【爬蟲筆記】【Python教學】淺談 Multi-processing & Multi-threading 使用方法 的介紹就到這邊告一個段落囉!有任何問題可以在以下留言~

有關 Max行銷誌的最新文章,都會發佈在 Max 的 Facebook 粉絲專頁,如果想看最新更新,還請您按讚或是追蹤唷!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *