>  기사  >  웹 프론트엔드  >  process 및 child_process 사용에 대한 자세한 설명

process 및 child_process 사용에 대한 자세한 설명

php中世界最好的语言
php中世界最好的语言원래의
2018-03-28 10:44:426553검색

이번에는 process와 child_process 사용에 대해 자세히 설명하겠습니다. process와 child_process 사용 시 주의사항은 무엇인가요?

일주일 동안 고생한 끝에 드디어 모호하고 어려운 문서를 이해하게 되었습니다. 여러분이 이해한 바를 여러분과 공유할 준비가 되었습니다.

in Node .js의 각 애플리케이션은 프로세스 클래스의 인스턴스 개체입니다.

  1. 프로세스 객체를 사용하여 애플리케이션을 표현합니다. 이는 Node.jsy 애플리케이션의 속성, 메서드 및 이벤트와 프로그램을 실행하는 사용자 및 환경과 같은 다양한 정보를 얻을 수 있는 전역 객체입니다.

  2. 프로세스의 여러 중요한 속성

stdin 표준 입력 읽기 가능 스트림

    stdout 표준 입력 쓰기 가능 스트림
  1. stderr 표준 오류 출력 스트림
  2. argv 입력 매개변수 배열
  3. env 운영 체제 환경 정보
  4. pid 애플리케이션 프로세스 ID
  5. stdin 및 stdout
  6. process.stdin.on('data', (chunk) => {
     process.stdout.write('进程接收到数据' + chunk)
    })

    실행 결과

argv

console.log(process.env)

env : Mac 터미널 NODE_ENV=develop에 내보내기를 입력합니다.

console.log(process.env.NODE_ENV) //develop

Process 메소드

process.memoryUsage() 메모리 사용량 정보 보기

    process.nextTick() 현재 이벤트 루프가 실행된 후 콜백 함수를 실행
  1. process.chdir( ) chdir 메소드는 Node.js 애플리케이션에서 사용되는 현재 작업 디렉토리를 수정하는 데 사용됩니다.

    process.cwd() 현재 작업 디렉토리 처리
  2. process.kill() 프로세스 종료
  3. process.uncaught
  4. 예외
  5. ()는 애플리케이션이 포착되지 않은 예외를 발생시킬 때 프로세스 객체의 uncaughtException 이벤트를 트리거합니다.

  6. say() //方法不存在
    process.on('uncaughtException',function(err){
     console.log('捕获到一个未被处理的错误:',err);
    });
  7. child_process

    하위 프로세스가 오늘 이야기의 초점이기도 합니다. 모두와 더 많이 소통하자

child_process의 배경

Node.js에서는 모든 작업을 수행하는 스레드가 단 하나뿐입니다. 작업에 많은 양의 CPU 리소스가 필요한 경우 후속 작업을 기다려야 합니다.

Node.js에는 child_process 모듈이 제공되는데, 이를 통해 여러 자식 프로세스를 시작할 수 있고, 여러 자식 프로세스 간에 메모리 공간을 공유할 수 있으며, 자식 프로세스 간의 상호 통신을 통해 정보 교환이 가능합니다.

child_process 모듈은 노드에 마음대로 하위 프로세스를 생성할 수 있는 기능을 제공합니다. 공식 노드 문서는 하위 프로세스를 생성하기 위해 운영 체제에 실제로 매핑되는 child_proces 모듈에 대한 네 가지 방법을 제공합니다. 하지만 개발자의 경우 이들 메소드의 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])는 node

를 사용하여 실행 결과를 가져오지 않고 .js 파일을 실행할 수 있습니다. 포크에서 나오는 하위 프로세스는 노드 프로세스


spawn

구문: child_process.spawn(command, [args], [options])

command 지정해야 하는 매개변수, 해당 명령을 지정합니다.

args 배열은 명령을 실행하는 데 필요한 모든 매개변수를 저장합니다
  1. 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开启一个子进程

  1. 衍生一个新的 Node.js 进程,并通过建立一个 IPC 通讯通道来调用一个指定的模块,该通道允许父进程与子进程之间相互发送信息

  2. fork方法返回一个隐式创建的代表子进程的ChildProcess对象

  3. 子进程的输入/输出操作执行完毕后,子进程不会自动退出,必须使用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打包之后文件路径出错如何处理

vue打包后字体和图片资源失效如何处理

위 내용은 process 및 child_process 사용에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.