進程(Process)和線程(Thread)都是操作系統中用於多任務處理的概念。簡單地說,一個進程就是一個程序的執行空間,而一個線程則是在執行空間內獨立運行的執行路徑。
區別:
- 進程是系統分配資源的最小單位,線程是操作系統調度的最小單位。
- 各個進程之間是獨立的,各個線程之間共享一些資源。
- 創建或銷燬進程時,會涉及到比較多的系統資源,開銷比較大,而線程的創建和銷燬的開銷相對較小。
- 進程與進程之間會有 IPC(進程間通信)的開銷,而線程之間的 IPC 開銷較小。
在 Chrome 瀏覽器中,會有多個進程同時運行:
- Browser 進程:負責管理整個瀏覽器的生命週期、顯示窗口、處理用戶操作等。
- Renderer 進程:負責一個 Tab 內關聯的頁面的渲染和運行,每個 Tab 都有一個獨立的 Renderer 進程。
- GPU 進程:負責處理頁面中使用的 WebGL 等 GPU 相關任務。
- Plugin 進程:負責運行插件,包括 Flash 等。
- Utility 進程:負責處理部分瀏覽器內部的任務,比如下載、DNS 等。
如果想讓 JS 代碼達到多線程併發執行的效果,可以使用 Web Workers。Web Workers 是運行在後臺的 JavaScript 線程,可以讓頁面在主線程中執行 JS 代碼的同時,創建一個或多個新的線程在後臺執行耗時的任務。Web Workers 的 API 包括:
- Worker 構造函數:用於創建一個新的 Worker 線程。
- postMessage() 方法:用於向 Worker 線程發送數據。
- onmessage 事件:用於監聽 Worker 線程發送回來的消息。
舉個例子,可以使用如下代碼創建一個 Worker 線程:
// file: worker.js
self.addEventListener('message', function(e) {
var data = e.data;
self.postMessage(data);
}, false);
// file: main.js
var worker = new Worker('worker.js');
worker.addEventListener('message', function(e) {
console.log('Worker said: ', e.data);
}, false);
worker.postMessage('Hello World');
在上面的例子中,我們在主線程中創建了一個 Worker 線程,向它發送了一條消息,並在 Worker 線程中處理這條消息,並將結果發回到主線程。這樣就實現了多線程的併發執行效果。