Node 雖然自身存在多個線程,但是運行在 v8 上的 JavaScript 是單線程的。 Node 的 child_process 模組用於建立子進程,我們可以透過子進程充分利用 CPU。範例:
var fork = require('child_process').fork;
// 取得目前機器的 CPU 數量
var cpus = require('os').cpus();
for (var i = 0; i // 產生新進程
fork('./worker.js');
}
這裡了解一下包含 fork 在內的幾個行程建立方法:
1.spawn(command, [args], [options]),啟動一個新進程來執行指令 command,args 為命令列參數
2.exec(command, [options], callback),啟動一個新進程來執行命令 command,callback 用於在進程結束時獲取標準輸入、標準輸出,以及錯誤訊息
3.execFile(file, [args], [options], [callback]),啟動一個新進程來執行執行檔 file,callback 用於在進程結束時取得標準輸入、標準輸出,以及錯誤訊息
4.fork(modulePath, [args], [options]),啟動一個新進程來執行一個 JavaScript 檔案模組,這時候創建的是 Node 子進程
Node 進程間通訊
父行程
// parent.js
var fork = require('child_process').fork;
// fork 回傳子程序物件 n
var n = fork('./child.js');
// 處理事件 message
n.on('message', function(m) {
// 收到子行程發送的訊息
console.log('got message: ' m);
});
// 傳送訊息給子行程
n.send({hello: 'world'});
子程序
// child.js
// 處理事件 message
process.on('message', function(m) {
console.log('got message: ' m);
});
// process 存在 send 方法,用於向父進程發送訊息
process.send({foo: 'bar'});
要注意的是,這裡的send 方法是同步的,因此不建議用於發送大量的資料(可以使用pipe 來代替,詳細見:http://nodejs.org/api/all. html#child_process_child_process_spawn_command_args_options)。
特殊的情況,訊息中 cmd 屬性值包含 NODE_ 前綴(例如:{cmd: ‘NODE_foo'} 訊息),那麼此訊息不會被提交到 message 事件(而是 internalMessage 事件),它們被 Node 內部使用。
send 方法的原型為:
send(message, [sendHandle])
這裡,sendHandle(handle)可以被用來寄:
1.net.Native,原生的 C TCP socket 或管道
2.net.Server,TCP 伺服器
3.net.Socket,TCP socket
4.dgram.Native,原生的 C UDP socket
5.dgram.Socket,UDP socket
send 發送 sendHandle 時實際上不是(也不能)直接發送 JavaScript 對象,而是發送文件描述符(最終以 JSON 字符串發送),其他進程能夠透過這個文件描述符還原出對應對象。
現在看一個例子:
父行程
// parent.js
var fork = require('child_process').fork;
var n = fork('./child.js');
var server = require('net').createServer();
server.listen(7000, function() {
// 傳送 TCP server 到子程序
n.send('server', server);
}).on('connection', function() {
console.log('connection - parent');
});
子程序
process.on('message', function(m, h) {
if (m === 'server') {
h.on('connection', function() {
console.log('connection - child');
});
}
});
透過連接埠 7000 存取此程序,得到輸出可能為 connection – parent 也可能得到輸出 connection – child。這裡子進程和父進程同時監聽了連接埠 7000。通常來說,多個進程監聽同一個連接埠會引起EADDRINUSE 的異常,而此例的情況是,不同的兩個進程使用了相同的檔案描述符,且Node 底層在監聽連接埠時對socket 設定了SO_REUSEADDR 選項,這使得此socket 可以在不同的進程間重複使用。當多個進程監聽同一個連接埠時,同一時刻檔案描述子只能被一個行程使用,這些行程對 socket 的使用是搶佔式的。
cluster 模組
在 Node 的 v0.8 新增了 cluster 模組,透過 cluster 模組能夠輕鬆的在一台實體機器上建立一組監聽相同連接埠的進程。範例:
var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;
// 檢查行程是否為 master 行程
if (cluster.isMaster) {
for (var i = 0; i // 產生新的 worker 行程(只有 master 行程才可呼叫)
cluster.fork();
cluster.on('exit', function(worker, code, signal) {
console.log('worker ' worker.process.pid ' died');
});
} else {
http.createServer(function(req, res) {
res.writeHead(200);
res.end('hello worldn');
}).listen(8000);
}
我們在 worker 程序中呼叫 listen 方法,監聽請求將會傳遞給 master 程序。如果 master 程序已經存在一個正在監聽的 server 符合 worker 程序的要求,那麼此 server 的 handle 將會傳遞給 worker,如果不存在,master 程序則會建立一個,然後將 handle 傳遞給 worker 程序。
更多詳細的關於 cluster 的文檔:http://www.nodejs.org/api/cluster.html

JavaScript核心數據類型在瀏覽器和Node.js中一致,但處理方式和額外類型有所不同。 1)全局對像在瀏覽器中為window,在Node.js中為global。 2)Node.js獨有Buffer對象,用於處理二進制數據。 3)性能和時間處理在兩者間也有差異,需根據環境調整代碼。

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

記事本++7.3.1
好用且免費的程式碼編輯器

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Linux新版
SublimeText3 Linux最新版

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!