이번에는 node의 process 및 child_process 모듈 사용에 대해 자세히 설명하겠습니다. node의 process 및 child_process 모듈 사용 시 주의 사항은 무엇입니까?
프로세스의 개념
Node.js에서 각 애플리케이션은 프로세스 클래스의 인스턴스 개체입니다.
프로세스 객체를 사용하여 애플리케이션을 표현합니다. 이는 Node.jsy 애플리케이션의 속성, 메서드 및 이벤트와 프로그램을 실행하는 사용자 및 환경과 같은 다양한 정보를 얻을 수 있는 전역 객체입니다.
프로세스의 몇 가지 중요한 속성
stdin 표준 입력 읽기 가능 스트림
stdout 표준 입력 쓰기 가능 스트림
stderr 표준 오류 출력 스트림
argv 터미널 입력 매개 변수 배열
운영 체제 환경 정보
pid 신청 프로세스 ID
stdin 및 stdout
process.stdin.on('data', (chunk) => { process.stdout.write('进程接收到数据' + chunk) })
실행 결과
argv
console.log(process.env)
env: Mac 터미널에export NODE_ENV=develop
console.log(process.env.NODE_ENV) //develop
를 입력합니다. 처리방법
process.memoryUsage() 메모리 사용량 정보 보기
process.nextTick() 실행 후 현재 이벤트 루프 실행 콜백 함수
process.chdir() chdir 메소드는 사용을 수정하는 데 사용됩니다. Node.js 애플리케이션 프로세스의 현재 작업 디렉터리
process.cwd() 프로세스의 현재 작업 디렉터리
process.kill() 프로세스 종료
process .uncaughtException() 애플리케이션이 포착되지 않은 예외가 발생하면 프로세스 객체의 uncaughtException 이벤트가 트리거됩니다
say() //方法不存在 process.on('uncaughtException',function(err){ console.log('捕获到一个未被处理的错误:',err); });
child_process
오늘 논의의 핵심은 서브프로세스인데 잘 이해가 안 되는 부분이 있어서 좀 더 소통할 수 있었으면 좋겠습니다
child_process가 나타나는 배경
Node.js에서는 하나의 스레드만 모든 작업을 수행합니다. 작업에 많은 양의 CPU 리소스가 필요한 경우 후속 작업을 기다려야 합니다.
Node.js에서는 child_process 모듈을 제공하는데 이를 통해 여러 자식 프로세스를 시작할 수 있고, 여러 자식 프로세스 간에 메모리 공간을 공유할 수 있으며, 자식 프로세스 간의 상호 통신을 통해 정보 교환이 가능합니다.
child_process 모듈은 노드에 마음대로 하위 프로세스를 생성하는 기능을 제공합니다. node의 공식 문서는 운영 체제에 매핑하면 실제로 하위 프로세스를 생성하는 네 가지 방법을 제공합니다. 하지만 개발자의 경우 이러한 메서드의 API는 약간 다릅니다
child_process.exec(command[, options][, callback])은
child 프로세스를 시작하여 쉘 명령을 실행합니다. 콜백 매개변수
를 통해 스크립트 쉘 실행 결과를 얻을 수 있습니다.
child_process.execfile(file[, args][, options][, callback])
exec 방식과 다르게 쉘 명령을 실행하지 않고 실행 파일을 실행합니다
child_process.spawn(command[, args][, options]) 은 쉘 명령만 실행하며 실행 결과를 얻을 필요가 없습니다
child_process.fork(modulePath[, args][, options])는 노드
를 사용하여 .js 파일을 실행할 수 있으며 실행 결과를 얻을 필요가 없습니다. 포크에서 나오는 자식 프로세스는 노드 프로세스여야 합니다
스폰
구문: child_process.spawn(command, [args], [options])
command는 실행해야 하는 명령을 지정하는 매개 변수입니다.
args 배열은 명령을 실행하는 데 필요한 모든 매개 변수를 저장합니다.
options 매개 변수는 명령을 지정하는 데 사용되는 개체입니다. 하위 프로세스를 시작할 때 사용되는 옵션
const { spawn } = require('child_process') const path = require('path') let child1 = spawn('node', ['test1.js', 'yanyongchao'], { stdio: ['pipe', 'pipe', 'pipe'], // 三个元素数组 下面会详解 cwd: dirname, 子进程工作目录 env: process.env, 环境变量 detached: true // 如果为true,当父进程不存在时也可以独立存在 })
사실 위의 내용은 sdtio 배열을 제외하면 이해하기 쉽습니다. stdio를 함께 분석해 볼까요
stdio
stdio是一个数组,用来设置标准输入,标准输出,错误输出。个人理解
pipe:父进程和子进程之间建立一个管道
主进程代码
const path = require('path') const { spawn } = require('child_process') let p = spawn('node', ['childs_t.js'], { cwd: path.join(dirname, 'childs'), stdio: ['pipe', 'pipe', process.stderr] }) p.stdout.on('data', (data) => { console.log(data.toString()) }) // 这里用stdout原因: 子进程的数据流与常规理解的数据流方向相反, // stdin:写入流,stdout、stderr:读取流。
子进程代码
process.stdout.write('asd')
如果在stdio中放一个流,process.stdout,process.stdin
主进程代码
const { spawn } = require('child_process') const path = require('path') // 如果放的是一个流,则意味着父进程和子进程共享一个流 const p = spawn('node', ['child_t.js'], { cwd: path.join(dirname, 'childs'), stdio: [process.stdin, process.stdout, process.stderr] })
子进程代码
process.stdout.write('asd') //控制台会输出asd
ipc
主进程代码
const path = require('path') const { spawn } = require('child_process') let p = spawn('node', ['child_t.js'], { cwd: path.join(dirname, 'childs'), stdio: ['ipc', 'pipe', 'pipe'] }) p.on('message', (msg) => { console.log(msg) }) p.send('hello chhild_process')
子进程代码
process.on('message', (msg) => { process.send('子进程' + msg) }) // child.send(message,[sendHandle]);//在父进程中向子进程发送消息 // process.send(message,[sendHandle]);//在子进程中向主进程发送消息
detached模式
const { spawn } = require('child_process') const fs = require('fs') const path = require('path') let out = fs.openSync(path.join(dirname, 'childs/msg.txt'), 'w', 0o666) let p = spawn('node', ['test4.js'], { detached: true, //保证父进程结束,子进程仍然可以运行 stdio: 'ignore', cwd: path.join(dirname, 'childs') }) p.unref() p.on('close', function() { console.log('子进程关闭') }) p.on('exit', function() { console.log('子进程退出') }) p.on('error', function(err) { console.log('子进程1开启失败' + err) })
fork开启一个子进程
衍生一个新的 Node.js 进程,并通过建立一个 IPC 通讯通道来调用一个指定的模块,该通道允许父进程与子进程之间相互发送信息
fork方法返回一个隐式创建的代表子进程的ChildProcess对象
子进程的输入/输出操作执行完毕后,子进程不会自动退出,必须使用process.exit()方法显式退出
子进程代码
const { fork } = require('child_process') const path = require('path') let child = fork(path.join(dirname, 'childs/fork1.js')) child.on('message', (data) => { console.log('父进程接收到消息' + data) }) child.send('hello fork') child.on('error', (err) => { console.error(err) })
子进程代码
process.on('message', (m, setHandle) => { console.log('子进程接收到消息' + m) process.send(m) //sendHandle是一个 net.Socket 或 net.Server 对象 })
exec开启子进程
// exec同步执行一个shell命令 let { exec } = require('child_process') let path = require('path') // 用于使用shell执行命令, 同步方法 let p1 = exec('node exec.js a b c', {cwd: path.join(dirname, 'childs')}, function(err, stdout, stderr) { console.log(stdout) })
execFile开启子进程
let { execFile } = require('child_process') let path = require('path') let p1 = execFile('node', ['exec.js', 'a', 'b', 'c'], { cwd: path.join(dirname, 'childs') }, function(err, stdout, stderr) { console.log(stdout) })
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
vue-cli 3.0.x升级到webpack4后有哪些新特性
위 내용은 노드의 프로세스 및 child_process 모듈 사용에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!