웹 프론트엔드 JS 튜토리얼 노드의 프로세스 및 child_process 모듈 사용에 대한 자세한 설명

노드의 프로세스 및 child_process 모듈 사용에 대한 자세한 설명

Apr 12, 2018 am 10:18 AM
child node process

이번에는 node의 process 및 child_process 모듈 사용에 대해 자세히 설명하겠습니다. node의 process 및 child_process 모듈 사용 시 주의 사항은 무엇입니까?

프로세스의 개념

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

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

프로세스의 몇 가지 중요한 속성

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

  2. stdout 표준 입력 쓰기 가능 스트림

  3. stderr 표준 오류 출력 스트림

  4. argv 터미널 입력 매개 변수 배열

  5. 운영 체제 환경 정보

  6. 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
로그인 후 복사

를 입력합니다. 처리방법

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

  2. process.nextTick() 실행 후 현재 이벤트 루프 실행 콜백 함수

  3. process.chdir() chdir 메소드는 사용을 수정하는 데 사용됩니다. Node.js 애플리케이션 프로세스의 현재 작업 디렉터리

  4. process.cwd() 프로세스의 현재 작업 디렉터리

  5. process.kill() 프로세스 종료

  6. 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])

  1. command는 실행해야 하는 명령을 지정하는 매개 변수입니다.

  2. args 배열은 명령을 실행하는 데 필요한 모든 매개 변수를 저장합니다.

  3. 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中文网其它相关文章!

推荐阅读:

vuex的项目结构与配置介绍

vue-cli 3.0.x升级到webpack4后有哪些新特性

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

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

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

nvm에서 노드를 삭제하는 방법 nvm에서 노드를 삭제하는 방법 Dec 29, 2022 am 10:07 AM

nvm을 사용하여 노드를 삭제하는 방법: 1. "nvm-setup.zip"을 다운로드하여 C 드라이브에 설치합니다. 2. "nvm -v" 명령을 통해 환경 변수를 구성하고 버전 번호를 확인합니다. install" 명령 노드 설치; 4. "nvm uninstall" 명령을 통해 설치된 노드를 삭제합니다.

Express를 사용하여 노드 프로젝트에서 파일 업로드를 처리하는 방법 Express를 사용하여 노드 프로젝트에서 파일 업로드를 처리하는 방법 Mar 28, 2023 pm 07:28 PM

파일 업로드를 처리하는 방법은 무엇입니까? 다음 글에서는 Express를 사용하여 노드 프로젝트에서 파일 업로드를 처리하는 방법을 소개하겠습니다. 도움이 되길 바랍니다.

Node의 프로세스 관리 도구 'pm2”에 대한 심층 분석 Node의 프로세스 관리 도구 'pm2”에 대한 심층 분석 Apr 03, 2023 pm 06:02 PM

이 기사에서는 Node의 프로세스 관리 도구인 "pm2"를 공유하고 pm2가 필요한 이유, pm2 설치 및 사용 방법에 대해 설명합니다. 모두에게 도움이 되기를 바랍니다!

PI 노드 교육 : PI 노드 란 무엇입니까? Pi 노드를 설치하고 설정하는 방법은 무엇입니까? PI 노드 교육 : PI 노드 란 무엇입니까? Pi 노드를 설치하고 설정하는 방법은 무엇입니까? Mar 05, 2025 pm 05:57 PM

Pinetwork 노드에 대한 자세한 설명 및 설치 안내서이 기사에서는 Pinetwork Ecosystem을 자세히 소개합니다. Pi 노드, Pinetwork 생태계의 주요 역할을 수행하고 설치 및 구성을위한 전체 단계를 제공합니다. Pinetwork 블록 체인 테스트 네트워크가 출시 된 후, PI 노드는 다가오는 주요 네트워크 릴리스를 준비하여 테스트에 적극적으로 참여하는 많은 개척자들의 중요한 부분이되었습니다. 아직 Pinetwork를 모른다면 Picoin이 무엇인지 참조하십시오. 리스팅 가격은 얼마입니까? PI 사용, 광업 및 보안 분석. Pinetwork 란 무엇입니까? Pinetwork 프로젝트는 2019 년에 시작되었으며 독점적 인 Cryptocurrency Pi Coin을 소유하고 있습니다. 이 프로젝트는 모든 사람이 참여할 수있는 사람을 만드는 것을 목표로합니다.

pkg를 사용하여 Node.js 프로젝트를 실행 파일로 패키징하는 방법에 대해 이야기해 보겠습니다. pkg를 사용하여 Node.js 프로젝트를 실행 파일로 패키징하는 방법에 대해 이야기해 보겠습니다. Dec 02, 2022 pm 09:06 PM

nodejs 실행 파일을 pkg로 패키징하는 방법은 무엇입니까? 다음 기사에서는 pkg를 사용하여 Node 프로젝트를 실행 파일로 패키징하는 방법을 소개합니다. 도움이 되기를 바랍니다.

npm node gyp가 실패하는 경우 수행할 작업 npm node gyp가 실패하는 경우 수행할 작업 Dec 29, 2022 pm 02:42 PM

"node-gyp.js"와 "Node.js"의 버전이 일치하지 않아 npm node gyp가 실패했습니다. 해결 방법: 1. "npm 캐시 clean -f"를 통해 노드 캐시를 지웁니다. 2. "npm install - g n" n 모듈을 설치합니다. 3. "n v12.21.0" 명령을 통해 "node v12.21.0" 버전을 설치합니다.

싱글 사인온(SSO) 시스템이란 무엇입니까? nodejs를 사용하여 구현하는 방법은 무엇입니까? 싱글 사인온(SSO) 시스템이란 무엇입니까? nodejs를 사용하여 구현하는 방법은 무엇입니까? Feb 24, 2023 pm 07:33 PM

싱글 사인온(SSO) 시스템이란 무엇입니까? nodejs를 사용하여 구현하는 방법은 무엇입니까? 다음 글에서는 Node를 사용하여 Single Sign-On 시스템을 구현하는 방법을 소개하겠습니다. 도움이 되길 바랍니다.

Angular 및 Node를 사용한 토큰 기반 인증 Angular 및 Node를 사용한 토큰 기반 인증 Sep 01, 2023 pm 02:01 PM

인증은 모든 웹 애플리케이션에서 가장 중요한 부분 중 하나입니다. 이 튜토리얼에서는 토큰 기반 인증 시스템과 기존 로그인 시스템과의 차이점에 대해 설명합니다. 이 튜토리얼이 끝나면 Angular와 Node.js로 작성된 완벽하게 작동하는 데모를 볼 수 있습니다. 기존 인증 시스템 토큰 기반 인증 시스템으로 넘어가기 전에 기존 인증 시스템을 살펴보겠습니다. 사용자는 로그인 양식에 사용자 이름과 비밀번호를 입력하고 로그인을 클릭합니다. 요청한 후 데이터베이스를 쿼리하여 백엔드에서 사용자를 인증합니다. 요청이 유효하면 데이터베이스에서 얻은 사용자 정보를 이용하여 세션을 생성하고, 세션 정보를 응답 헤더에 반환하여 브라우저에 세션 ID를 저장한다. 다음과 같은 애플리케이션에 대한 액세스를 제공합니다.

See all articles