写点什么

开源一夏 | Node.js 实战之 Node 多进程与 JXcore 打包深入运用

作者:黎燃
  • 2022 年 8 月 19 日
    内蒙古
  • 本文字数:2043 字

    阅读完需:约 7 分钟

JXcore 打包


Jxcore 是一个支持多线程 JS 发布版本的节点,基本上不需要对现有代码进行任何更改,可以直接在多线程中运行,具有线程安全性。本文主要介绍 jxcore 的封装功能。下载 jxcore 安装包并解压缩。解压目录中提供了 JX 二进制文件命令。接下来,我们主要使用这个命令。Linux/OSX 安装命令:


$ curl https://raw.githubusercontent.com/jxcore/jxcore/master/tools/jx_install.sh | bash
复制代码


如果权限不足,可以使用以下命令:


$ curl https://raw.githubusercontent.com/jxcore/jxcore/master/tools/jx_install.sh | sudo bash
复制代码


如果上述步骤正确,将使用以下命令输出版本号信息:


$ jx --versionv0.10.32
复制代码


如果成功执行上述命令,将生成以下两个文件:指数这是一个中间件文件,包含需要编译的完整项目信息。指数这是一个完整包信息的二进制文件,可以在客户端上运行。


drwxr-xr-x  2 root root  4096 Nov 13 12:42 images-rwxr-xr-x  1 root root 30457 Mar  6 12:19 index.htm-rwxr-xr-x  1 root root 30452 Mar  1 12:54 index.jsdrwxr-xr-x 23 root root  4096 Jan 15 03:48 node_modulesdrwxr-xr-x  2 root root  4096 Mar 21 06:10 scriptsdrwxr-xr-x  2 root root  4096 Feb 15 11:56 style
复制代码


Node.js 的项目运行:


$ node index.js command_line_arguments
复制代码


使用 JXcore 编译后,我们可以使用以下命令来执行生成的 jx 二进制文件:


$ jx index.jx command_line_arguments
复制代码

Node.js 多进程

我们都知道 node JS 以单线程模式运行,但它使用事件驱动来处理并发。这有助于我们在多核 CPU 系统上创建多个子进程,从而提高性能。每个子进程总是有三个流对象:child 和 stdin,以及 child。标准输出和子标准输出它们可以共享父进程的 stdio 流,也可以是独立的重定向流对象。节点提供 child_流程模块用于通过以下方式创建子流程:exec-child_进程。Exec 使用子进程执行命令,缓存子进程的输出,并以回调函数参数的形式返回子进程的结果。spawn-child_进程。Spawn 使用指定的命令行参数创建新进程。fork-child_进程。Fork 是 spawn()的一种特殊形式,用于在子进程中运行的模块。例如,fork('./son.JS')等同于 spawn('node'['./son.JS')。与 spawn 方法不同,fork 将在父进程和子进程之间建立通信管道,用于进程之间的通信。

exec() 方法

child_进程。Exec 使用子进程执行命令,缓存子进程的输出,并以回调函数参数的形式返回子进程的结果。


child_process.exec(command[, options], callback)
复制代码


callback:回调函数,包括三个参数:error、stdout 和 stderr。exec()方法返回最大缓冲区,等待进程结束,并一次返回缓冲区的内容。


onsole.log("进程 " + process.argv[2] + " 执行。" );
复制代码


const fs = require('fs');const child_process = require('child_process'); for(var i=0; i<3; i++) {    var workerProcess = child_process.exec('node support.js '+i, function (error, stdout, stderr) {        if (error) {            console.log(error.stack);            console.log('Error code: '+error.code);            console.log('Signal received: '+error.signal);        }        console.log('stdout: ' + stdout);        console.log('stderr: ' + stderr);    });     workerProcess.on('exit', function (code) {        console.log('子进程已退出,退出码 '+code);    });}
复制代码


执行上述代码,输出结果为:


$ node master.js 子进程已退出,退出码 0stdout: 进程 1 执行。

stderr: 子进程已退出,退出码 0 stdout: 进程 0 执行。

stderr: 子进程已退出,退出码 0 stdout: 进程 2 执行。

spawn() 方法

child_process.spawn(command[, args][, options])
复制代码


spawn()方法返回一个流(stdout&stderr),当进程返回大量数据时使用该流。一旦进程开始执行,spawn()就开始接收响应。


console.log("进程 " + process.argv[2] + " 执行。" );
复制代码


const fs = require('fs');const child_process = require('child_process'); for(var i=0; i<3; i++) {   var workerProcess = child_process.spawn('node', ['support.js', i]);    workerProcess.stdout.on('data', function (data) {      console.log('stdout: ' + data);   });    workerProcess.stderr.on('data', function (data) {      console.log('stderr: ' + data);   });    workerProcess.on('close', function (code) {      console.log('子进程已退出,退出码 '+code);   });}
复制代码


执行以上代码,输出结果为:子进程已退出


子进程已退出,退出码 0stdout: 进程 1 执行。
子进程已退出,退出码 0stdout: 进程 2 执行。
复制代码

fork 方法

child_进程。Fork 是 spawn()方法的一种特殊形式,用于创建进程。语法格式如下:


child_process.fork(modulePath[, args][, options])
复制代码


除了 childprocess 实例的所有方法之外,返回的对象还具有内置的通信通道。说明如下:


Modulepath:string,要在子进程中运行的模块 Args:数组字符串参数数组 options:对象

发布于: 刚刚阅读数: 2
用户头像

黎燃

关注

前端工程师 2022.05.06 加入

专注学习分享前端知识。

评论

发布
暂无评论
开源一夏  | Node.js实战之Node多进程与JXcore 打包深入运用_开源_黎燃_InfoQ写作社区