Multi-Process(多行程)&Multi-Thread(多執行序)到底是個啥(2)

Justin Hollly
4 min readJan 13, 2022

--

Multi-Process(多行程)&Multi-Thread(多執行序)到底是個啥(1)

Multi Thread (多執行序) 到底是個啥(3) 之 NodeJs 也有 threads

上一篇大概做了 Process, Thread 的解釋,並介紹 Multi-Process, Multi-Thread 是怎樣子運作的,接下來就要開始看一下應用啦!

Multi-Process

上一篇文章說過,因為資源視獨立分開的,因此除了是在多核 CPU 下運作,其他時間運作是需要進行資源切換的(context switch),因此使用 Multi-Process 主要會是兩種情況:

1. 應用程式真的很複雜,需要區分開不同資源。例如 Google Chrome,主要有三種 processes,Browser、Renderers、Plug-ins。分別處理瀏覽器分頁或檔案下載、畫面渲染、以及外掛軟體的運算。

2. 以防應用程式中斷,導致整個程式強制關閉。多個 process 運行中,其中一個因錯誤中斷,並不會導致全體中斷,只會讓該 process 中斷,但是如果只有一個 process,其中一個 thread 中斷,整個 process 就中斷了。

Google 官方介紹文件

Multi-Thread

如果需要運算的功能並沒有很複雜,並且需要運算的資料不會很多,就可以使用 Multi-Thread。因為需要切換的資料量很小,並且有共用的記憶體區域(heap),可以更加快速的進行 context switch。但也因為有共用記憶體區域,會產生一些問題,我相信你心裡想到的跟我一樣,就是 race condition。在使用 Multi-Thread 時一定要考慮到這個問題,否則很容易產生資料錯亂或是 dead lock。

不過幸運的是,我們現在都是站在巨人的肩膀上寫程式,程式語言已經有機制幫我們處理好這個大問題。但也因為語言機制不同,會有不同的應用。

以 Java 為例:

Java 中的 JVM 有很完善的鎖機制,可以確保在寫入資料時具有 synchronized 的特性,也就是同步,會按照順序 lock,釋放後才換到隊伍下一位。同時因為 Java 是支援 thread 也可以在多核 CPU 進行平行運算,也會有暫存資料區稱作 volatile,會與 main memory 統一溝通。因此在 Java 中,並沒有 I/O bound 適合 Multi-Thread、CPU bound 適合 Multi-Process 這種說法,其實都是可以提升速度的好方法,端看你對於資源的需求大還是小,如果是爬蟲這種需求資源小、功能簡單、並且需要有等待且快速切換的程式,就適合使用 Multi-Thread。但是 Multi-thread 一樣可以使用在 CPU 運算密集的程式中的。

但是 Python 就不同了:

Python 一樣有鎖機制(GIL),但是沒有 volatile 機制,因次 python 的 Multi-Thread 只能是 concurrency 運算,沒有 parallel 運算。所以我們常常在網路上看到的 CPU bound,CPU 密集會適合 Multi-Process 是在指 Python。因為 Python 只有只用 Multi-Process 才能真正使用到多核。然後 Multi-Thread 只適合高 I/O 、計算量低的程式。

所以我們常看到的 I/O Bound、CPU Bound 多半是指 python 的限制而造成的選擇。

參考這位大大的解釋

這邊也有做 Python GIL 的解釋

JavaScript 也有 Multi-Thread?

在 2020 年的 Node.js 官方更新介紹有提到目前已經加入 worker thread,藉此模擬 Multi-thread 的工作模式,不過官方並不建議加在 production 產品中。但這也代表官方有意往這方向前進,因為未來 AI、ML 的應用會越來越廣。

官方介紹,不只 worker thread,還有很多滿炫的功能。

參考資料

--

--