查看“Node.js:多进程”的源代码
←
Node.js:多进程
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[category:Node.js教程]] == 关于 == Node.js 是以单线程的模式运行的,但它使用的是事件驱动来处理并发,这样有助于我们在多核 cpu 的系统上创建多个子进程,从而提高性能。 每个子进程总是带有三个流对象:'''child.stdin'''、'''child.stdout''' 和'''child.stderr'''。他们可能会共享父进程的 stdio 流,或者也可以是独立的被导流的流对象。 Node 提供了 '''child_process''' 模块来创建子进程,方法有: # '''exec''':“child_process.exec”使用子进程执行命令,缓存子进程的输出,并将子进程的输出以回调函数参数的形式返回。 # '''spawn''':“child_process.spawn”使用指定的命令行参数创建新进程。 # '''fork''':“child_process.fork”是 spawn() 的特殊形式,用于在子进程中运行的模块。如:“fork('./son.js')”相当于“spawn('node', ['./son.js'])” 。 * 与 spawn 方法不同的是,fork 会在父进程与子进程之间,建立一个'''通信管道''',用于进程之间的通信。 == '''exec'''方法 == '''<code>child_process.exec</code>''' '''使用子进程执行命令,缓存子进程的输出,并将子进程的输出以回调函数参数的形式返回'''。 语法: '''<syntaxhighlight lang="bash" highlight=""> child_process.exec(command[, options], callback) </syntaxhighlight>''' * exec() 方法返回最大的缓冲区,并等待进程结束,一次性返回缓冲区的内容。 参数: * command:(String)将要运行的命令,参数使用空格隔开; * options:(Object): ** cwd:(String)子进程的当前工作目录; ** env:(Object)环境变量键值对; ** encoding:(String)字符编码;(默认: 'utf8') ** shell:(String)将要执行命令的 Shell;(默认:在 UNIX 中为 /bin/sh, 在 Windows 中为 cmd.exe) ** timeout:(Number)超时时间;(默认: 0) ** maxBuffer:(Number)在 stdout 或 stderr 中允许存在的最大缓冲(二进制),如果超出那么子进程将会被杀死;(默认: 200*1024) ** killSignal:(String)结束信号;(默认:'SIGTERM') ** uid:(Number)设置用户进程的 ID; ** gid:(Number)设置进程组的 ID; * callback :回调函数,包含三个参数 '''error''', '''stdout''' 和 '''stderr'''。 示例: # 创建 support.js: #: <syntaxhighlight lang="JavaScript" highlight=""> console.log("进程 " + process.argv[2] + " 执行。" ); </syntaxhighlight> # 创建 master.js: #: <syntaxhighlight lang="JavaScript" highlight="2,5"> 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); }); } </syntaxhighlight> # 执行以上代码,输出结果为:【???】 #: <syntaxhighlight lang="bash" highlight=""> $ node master.js 子进程已退出,退出码 0 stdout: 进程 1 执行。 stderr: 子进程已退出,退出码 0 stdout: 进程 0 执行。 stderr: 子进程已退出,退出码 0 stdout: 进程 2 执行。 stderr: </syntaxhighlight> == '''spawn'''方法 == '''<code>child_process.spawn</code>''' '''使用指定的命令行参数创建新进程'''。 语法: '''<syntaxhighlight lang="bash" highlight=""> child_process.spawn(command[, args][, options]) </syntaxhighlight>''' * spawn() 方法返回流 (stdout & stderr),在进程返回大量数据时使用。 * 进程一旦开始执行时 spawn() 就开始接收响应。 参数: * command:(String)将要运行的命令; * args:(Array)字符串参数; * options:(Object): ** cwd:(String)子进程的当前工作目录; ** env:(Object)环境变量键值对; ** stdio:(Array|String)子进程的 stdio 配置; ** detached:(Boolean)这个子进程将会变成进程组的领导; ** uid:(Number)设置用户进程的 ID; ** gid:(Number)设置进程组的 ID; 示例: # 创建 support.js: #: <syntaxhighlight lang="JavaScript" highlight=""> console.log("进程 " + process.argv[2] + " 执行。" ); </syntaxhighlight> # 创建 master.js: #: <syntaxhighlight lang="JavaScript" highlight="2,5"> 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); }); } </syntaxhighlight> # 执行以上代码,输出结果为: #: <syntaxhighlight lang="bash" highlight=""> $ node master.js stdout: 进程 0 执行。 子进程已退出,退出码 0 stdout: 进程 1 执行。 子进程已退出,退出码 0 stdout: 进程 2 执行。 子进程已退出,退出码 0 </syntaxhighlight> == '''fork'''方法 == '''<code>child_process.fork</code>''' 是 spawn() 方法的特殊形式,用于'''创建进程'''。 语法: '''<syntaxhighlight lang="bash" highlight=""> child_process.fork(modulePath[, args][, options]) </syntaxhighlight>''' * 返回的对象除了拥有 ChildProcess 实例的所有方法,还有一个内建的'''通信信道'''。 参数: * modulePath:(String)将要在子进程中运行的模块; * args:(Array)字符串参数数组; * options:(Object): ** cwd:(String)子进程的当前工作目录; ** env:(Object)环境变量键值对; ** execPath:(String)创建子进程的可执行文件; ** execArgv:(Array)子进程的可执行文件的字符串参数数组;(默认: process.execArgv) ** silent:(Boolean)如果为 true,子进程的 stdin,stdout 和 stderr 将会被关联至父进程,否则,它们将会从父进程中继承;(默认为:false) ** uid:(Number)设置用户进程的 ID; ** gid:(Number)设置进程组的 ID; 示例: # 创建 support.js: #: <syntaxhighlight lang="JavaScript" highlight=""> console.log("进程 " + process.argv[2] + " 执行。" ); </syntaxhighlight> # 创建 master.js: #: <syntaxhighlight lang="JavaScript" highlight="2,5"> const fs = require('fs'); const child_process = require('child_process'); for(var i=0; i<3; i++) { var worker_process = child_process.fork("support.js", [i]); worker_process.on('close', function (code) { console.log('子进程已退出,退出码 ' + code); }); } </syntaxhighlight> # 执行以上代码,输出结果为: #: <syntaxhighlight lang="bash" highlight=""> $ node master.js 进程 0 执行。 子进程已退出,退出码 0 进程 1 执行。 子进程已退出,退出码 0 进程 2 执行。 子进程已退出,退出码 0 </syntaxhighlight>
返回至“
Node.js:多进程
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
笔记
服务器
数据库
后端
前端
工具
《To do list》
日常
阅读
电影
摄影
其他
Software
Windows
WIKIOE
所有分类
所有页面
侧边栏
站点日志
工具
链入页面
相关更改
特殊页面
页面信息