Node 雖然自身存在多個線程,但是運行在 v8 上的 JavaScript 是單線程的。Node 的 child_process 模塊用于創建子進程,我們可以通過子進程充分利用 CPU。范例:
這里了解一下包括 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 進程間通信
父進程
子進程
需要注意的是,這里的 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 方法的原型為:
這里,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 字符串發送),其他進程能夠通過這個文件描述符還原出對應對象。
現在看一個例子:
父進程
子進程
通過端口 7000 訪問此程序,得到輸出可能為 connection 主站蜘蛛池模板: 抚顺市| 睢宁县| 腾冲县| 泰兴市| 高台县| 绥棱县| 乳山市| 疏附县| 西宁市| 宜宾市| 广安市| 兴隆县| 洪雅县| 克山县| 岐山县| 镇赉县| 太康县| 紫云| 北辰区| 德兴市| 赤水市| 读书| 云和县| 千阳县| 静乐县| 濮阳县| 乐都县| 九龙城区| 金寨县| 新田县| 仁寿县| 都江堰市| 五指山市| 武功县| 彭山县| 泗阳县| 韶关市| 安宁市| 买车| 阳东县| 洛南县|