➣ Reading Time: 6 minutes

前言

此部份可參考:【python】python thread multiprocess 比較總整理

在 python 中有 thread 與 multiprocess 兩種平行處理程式的方式,
兩者分別的特性為:

  • thread: 可直接使用全域變數 (global) 交換資訊
  • multiprocess: 需透過設定特定通道 (多核心執行的中央變數管理,另一篇文會提到) 才能拿到資訊

也因此會有不同的特性:

  • thread: 適合小任務、資訊共用的任務 (直接拿 global 資訊來用)
  • multiprocess: 適合大任務、資訊獨立的任務 (把相關資訊交由其他核心處理後,不太需要拿取新資訊)

而在時間上,python 的 thread 實作有使用 GIL (global interpreter lock) ,
這是為了保護程式取用資料衝突的機制 (一般而言,我們會自己建立 mutex 或 lock 來實現這一點),
但也因為內建此機制的原因,實際執行上會慢於 multiprocess。

(可以有一種想法是,當 python 的 thread 實現方式是建立在大量的 context switch上)

而 multiprocess 可以幫助我們更好的運用硬體的多核心資源,
也就是將電腦的能力發揮到更極限,達到更好的效果。
(一般執行程式只需要一個核心)

但要注意:送資料到別的核心需要時間
如果是簡單不需要太多時間的任務,
使用多核心運算的方式反而會在資料搬運上浪費更多時間。

小整理

功能threadmultiprocess
速度快 (受限於 GIL)更快
電腦資源使用極限更極限
資訊共用容易度相對容易複雜 (注意:送資料到別的核心需要時間)
適合任務小任務、資訊共用的任務大任務、資訊獨立的任務

multiprocess 實現,與取得結果

以下為範例 code,我們可在 task 做自己想做的事情,
最後透過 result.get() 拿回結果。

這裡我們做一個暫停 10 秒的實驗,
如果最後程式執行結束時間超過 40秒 (4核心),
表示這個程式並沒有多核心的執行。

sample code (範例程式碼)

import multiprocessing 
import time

def task(cpu_no):
    # do something
    print("cpu_no: ", cpu_no)
    time.sleep(10)
    result = cpu_no

    return result

def main():
    # multiprocessing.freeze_support()
    pool = multiprocessing.Pool()
    cpus = multiprocessing.cpu_count()
    print("cpu_count: ", cpus)
    results = []

    for i in range(0, cpus):
        result = pool.apply_async(task, args=(i,) )
        results.append(result)

    pool.close()
    pool.join()

    for result in results:
        print("result: ", result.get())


if __name__ == "__main__":
    main()


結果

我們可以看到,4核心的電腦,程式執行只花10秒左右,
能證明我們的程式確實有多核心執行。

 ⭐Python 基礎用法 相關文章整理⭐:
1.【Python】python list 清除, 移除內容元素 remove, pop, del, clear相關用法整理 sample code (內含範例程式碼)
2.【Python】寫模組 module、package 總整理 Importing files from different folder
3.【Python】python assert (斷言) 用法 sample code (內含範例程式碼)
4.【Python】python 一行 if else 語法 (one line if else) sample code (內含範例程式碼)
⭐Python 字串處理 相關文章整理⭐:
1.【Python】python string format str.format 總整理
⭐Python 檔案處理相關文章整理⭐:
1.【Python】python 開關檔範例 與 程式模板 with open / file open sample code
2.【Python】取出檔案名稱 (含副檔名、不含副檔名) os path basename split 取出 檔名 路徑 不要副檔名 sample code
3.【Python】在 python 中利用 os.chmod 更改檔案的權限 chmod 777
4.【Python】利用 shutil 來複製檔案 shutil copy file
5.【Python】python 建立資料夾範例 mkdir os.makedirs() sample code
6.【Python】python 移除資料夾範例 rmdir shutil.rmtree() sample code
7.【Python】確認檔案是否存在 os.path.isfile / 確認資料夾是否存在 os.path.isdir sample code is folder / file exist
⭐Python 系統偵測 相關文章整理⭐:
1.【Python】python pyinotify sample code 偵測指定路徑底下的文件變化 (內有範例程式碼)
⭐Python 平行運算 相關文章整理⭐:
1.【Python】python pooling multiprocess – 用多核心來執行程式 sample code (內含範例程式碼)
2.【Python】python thread multiprocess 比較總整理
⭐Python 測試程式 相關文章整理⭐:
1.【Python】python 測試程式 – 利用 doctest 測試 python testcase 的優雅寫法,適用於 leetcode (doctest in function,搭配 function 的用法)
2.【Leetcode】python – 利用 doctest 測試 leetcode python testcase 的優雅寫法 (doctest in class,搭配 class 的用法)