>  기사  >  웹 프론트엔드  >  노드에서 process 및 child_process 모듈을 학습하는 방법(자세한 튜토리얼)

노드에서 process 및 child_process 모듈을 학습하는 방법(자세한 튜토리얼)

亚连
亚连원래의
2018-06-01 10:41:121833검색

이 글은 주로 노드의 프로세스와 child_process 모듈에 대한 학습노트를 소개하고 있으니 참고하시기 바랍니다.

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

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

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

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.Memoryusage () 메모리 사용량 정보 보기

    Process.nextTick () 현재 이벤트루프에서 실행 함수를 실행
  1. Process.chdir () chidir () 사용되는 메소드 Node.js 애플리케이션에서 사용되는 현재 작업 디렉토리 수정
  2. process.cwd() 현재 작업 디렉토리 처리
  3. process.kill() 프로세스 종료
  4. process.uncaughtException() 다음의 uncaughtException 이벤트 애플리케이션이 포착되지 않은 예외를 발생시키면 프로세스 객체가 트리거됩니다.
  5. say() //方法不存在
    process.on('uncaughtException',function(err){
     console.log('捕获到一个未被处理的错误:',err);
    });
  6. child_process

  7. 오늘의 초점은 제가 잘 이해하지 못하는 부분도 있습니다. you more

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 매개변수는 하위 프로세스를 시작할 때 사용되는 옵션을 지정하는 데 사용되는 객체입니다.
  2. 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,当父进程不存在时也可以独立存在
    })
  3. 실제로 위의 내용은 sdtio 배열만 빼면 이해하기 쉬우니 아래에서 같이 해보자 stdio
  4. 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

스트림에 넣으면 메인 프로세스 code

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]);//在子进程中向主进程发送消息

분리 모드

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 객체를 반환합니다
  1. 자식 프로세스의 입출력 작업이 완료된 후에는 자식 프로세스가 자동으로 종료되지 않습니다. 명시적으로 종료하려면 process.exit() 메서드를 사용해야 합니다.
  2. 하위 프로세스 코드
  3. 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)
})

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

根据vue里面设置全局变量或者数据方法(详细教程)

利用jquery点击回车键实现登录效果(详细教程)

如何在vue2中设置全局变量?(详细教程)

위 내용은 노드에서 process 및 child_process 모듈을 학습하는 방법(자세한 튜토리얼)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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