목차
프로세스: 프로세스 모듈
명령 매개 변수를 처리하는 방법은 무엇입니까?
如何处理工作目录?
如何处理异常?
uncaughtException 事件
unhandledRejection 事件
프로세스 종료를 처리하는 방법은 무엇입니까?
深入理解 process.nextTick
子进程:child_process模块
创建子进程
父子进程通信
独立子进程
进程管道
웹 프론트엔드 JS 튜토리얼 Node의 프로세스와 하위 프로세스를 탐색하는 기사

Node의 프로세스와 하위 프로세스를 탐색하는 기사

Oct 12, 2022 pm 07:31 PM
nodejs node.js node

이 글은 Node의 프로세스와 하위 프로세스에 대한 심층적인 이해를 제공할 것입니다. 모든 사람에게 도움이 되기를 바랍니다!

Node의 프로세스와 하위 프로세스를 탐색하는 기사

프로세스: 프로세스 모듈

프로세스 모듈은 개발자가 현재 프로세스와 상호작용할 수 있도록 nodejs에서 제공하는 도구입니다. 문서에서 시작하여 표범을 살짝 살펴보고 프로세스 모듈을 더 이해하고 배우십시오.

  • 명령 매개변수를 처리하는 방법은 무엇입니까?
  • 작업 디렉토리를 처리하는 방법은 무엇입니까?
  • 예외를 처리하는 방법은 무엇입니까?
  • 프로세스 종료를 처리하는 방법은 무엇입니까?
  • process의 표준 스트림 객체
  • process.nextTick에 대한 심층적인 이해

[관련 튜토리얼 권장 사항: nodejs 비디오 튜토리얼]

명령 매개 변수를 처리하는 방법은 무엇입니까?

명령줄 매개변수는 2가지 측면을 나타냅니다.

  • 노드에 전달되는 매개변수. 예를 들어 node --harmony script.js --version에서 --harmony는 nodenode --harmony script.js --version 中,--harmony 就是传给 node 的参数
  • 传给进程的参数。例如 node script.js --version --help 中,--version --help 就是传给进程的参数

它们分别通过 process.argvprocess.execArgv 来获得。

如何处理工作目录?

通过process.cwd()可以获取当前的工作目录。

通过process.chdir(directory)可以切换当前的工作目录,失败后会抛出异常。实践如下:

function safeChdir(dir) {
    try {
        process.chdir(dir);
        return true;
    } catch (error) {
        return false;
    }
}
로그인 후 복사

如何处理异常?

uncaughtException 事件

Nodejs 可以通过 try-catch 来捕获异常。如果异常未捕获,则会一直从底向事件循环冒泡。如是冒泡到事件循环的异常没被处理,那么就会导致当前进程异常退出。

根据文档,可以通过监听 process 的 uncaughtException 事件,来处理未捕获的异常:

process.on("uncaughtException", (err, origin) => {
    console.log(err.message);
});

const a = 1 / b;
console.log("abc"); // 不会执行
로그인 후 복사

上面的代码,控制台的输出是:b is not defined。捕获了错误信息,并且进程以0退出。开发者可以在 uncaughtException 事件中,清除一些已经分配的资源(文件描述符、句柄等),不推荐在其中重启进程。

unhandledRejection 事件

如果一个 Promise 回调的异常没有被.catch()

에 전달되고 프로세스에 전달되는 매개변수입니다. 예를 들어 node script.js --version --help에서 --version --help는 프로세스에 전달되는 매개변수입니다

이들은 process.argvprocess.execArgv를 가져옵니다.

작업 디렉터리를 어떻게 처리하나요?

현재 작업 디렉터리는 process.cwd()를 통해 얻을 수 있습니다.

process.chdir(directory)를 통해 현재 작업 디렉터리를 전환할 수 있으며, 실패하면 예외가 발생합니다. 연습은 다음과 같습니다:
process.on("unhandledRejection", (err, promise) => {
    console.log(err.message);
});

Promise.reject(new Error("错误信息")); // 未被catch捕获的异常,交由unhandledRejection事件处理
로그인 후 복사

예외를 처리하는 방법은 무엇입니까?

uncaughtException event

Nodejs는 try-catch를 통해 예외를 포착할 수 있습니다. 예외가 포착되지 않으면 항상 아래쪽에서 이벤트 루프까지 버블링됩니다. 이벤트 루프까지 버블링되는 예외를 처리하지 않으면 현재 프로세스가 비정상적으로 종료됩니다.

문서에 따르면 프로세스의 uncaughtException 이벤트를 수신하여 포착되지 않은 예외를 처리할 수 있습니다.

setTimeout(() => {
    console.log("我不会执行");
});

process.exit(0);
로그인 후 복사
위 코드의 경우 콘솔 출력은 b가 정의되지 않았습니다입니다. 오류 메시지가 포착되었으며 프로세스가 0으로 종료되었습니다. 개발자는 uncaughtException 이벤트에서 일부 할당된 리소스(파일 설명자, 핸들 등)를 지울 수 있으며 프로세스를 다시 시작하지 않는 것이 좋습니다.

unhandledRejection 이벤트

Promise 콜백 예외가 .catch()에 의해 포착되지 않으면 프로세스의 unhandledRejection 이벤트가 트리거됩니다. :

setTimeout(() => {
    console.log("我不会执行");
});

process.exitCode = 1;
로그인 후 복사

warning event

경고는 Node.js 및 Javascript 오류 처리 프로세스의 공식적인 부분이 아닙니다. Node.js는 애플리케이션 성능 문제, 결함 또는 보안 위험으로 이어질 수 있는 코딩 관행을 감지하면 경고를 발행할 수 있습니다. 예를 들어 이전 코드에서 포착되지 않은 Promise 콜백 예외가 발생하면 경고 이벤트가 트리거됩니다.

프로세스 종료를 처리하는 방법은 무엇입니까?

process.exit() vs process.exitCode

nodejs 프로세스는 process.exit()를 통해 종료 코드를 지정하고 직접 종료할 수 있습니다.

process.exit()를 직접 사용하는 것은 권장되지 않습니다

. 이렇게 하면 이벤트 루프의 작업이 직접 처리되지 않고 잘림 및 데이터 손실(예: stdout에 쓰기)이 발생할 수 있습니다.

let hasSend = false;
process.on("beforeExit", () => {
    if (hasSend) return; // 避免死循环

    setTimeout(() => {
        console.log("mock send data to serve");
        hasSend = true;
    }, 500);
});

console.log(".......");
// 输出:
// .......
// mock send data to serve
로그인 후 복사
🎜🎜올바르고 안전한 처리 방법은 🎜 process.exitCode를 설정하고 프로세스가 자연스럽게 종료되도록 하는 것입니다. 🎜
process.stdin.setEncoding("utf8");

process.stdin.on("readable", () => {
    let chunk;
    while ((chunk = process.stdin.read()) !== null) {
        process.stdout.write(`>>> ${chunk}`);
    }
});

process.stdin.on("end", () => {
    process.stdout.write("结束");
});
로그인 후 복사
로그인 후 복사
🎜🎜beforeExit 이벤트🎜🎜🎜프로세스 종료를 처리하는 데 사용되는 이벤트는 beforeExit 이벤트와 종료 이벤트입니다. 🎜🎜Node.js가 이벤트 루프를 지우고 더 이상 예약할 작업이 없으면 beforeExit 이벤트가 시작됩니다. 예를 들어 종료하기 전에 비동기 작업이 필요한 경우 beforeExit 이벤트에 이를 작성할 수 있습니다. 🎜
// 被拆分成2个函数执行
function BigThing() {
    doPartThing();

    process.nextTick(() => finishThing());
}
로그인 후 복사
로그인 후 복사
🎜참고: beforeExit 이벤트의 비동기 작업인 경우 작업 대기열에 추가됩니다. 이때 작업 큐가 모든 작업을 완료한 후 beforeExit 이벤트가 다시 트리거됩니다. 따라서 처리하지 않을 경우 🎜무한루프🎜가 발생할 수 있습니다. Exit()가 명시적으로 호출되면 이 이벤트가 트리거되지 않습니다. 🎜🎜🎜exit 이벤트🎜🎜🎜exit 이벤트에서는 동기 연산만 수행할 수 있습니다. 'exit' 이벤트 리스너를 호출한 후 Node.js 프로세스가 즉시 종료되어 이벤트 루프에 아직 대기 중인 다른 작업이 중단됩니다. 🎜🎜🎜process의 표준 스트림 개체 🎜🎜🎜process는 3가지 표준 스트림을 제공합니다. 그 중 일부는 어느 시점에서 동기적으로 차단된다는 점에 유의하세요(문서 참조). 🎜
  • process.stderr:WriteStream 类型,console.error的底层实现,默认对应屏幕
  • process.stdout:WriteStream 类型,console.log的底层实现,默认对应屏幕
  • process.stdin:ReadStream 类型,默认对应键盘输入

下面是基于“生产者-消费者模型”的读取控制台输入并且及时输出的代码:

process.stdin.setEncoding("utf8");

process.stdin.on("readable", () => {
    let chunk;
    while ((chunk = process.stdin.read()) !== null) {
        process.stdout.write(`>>> ${chunk}`);
    }
});

process.stdin.on("end", () => {
    process.stdout.write("结束");
});
로그인 후 복사
로그인 후 복사

关于事件的含义,还是请看stream 的文档。

深入理解 process.nextTick

我第一次看到 process.nextTick 的时候是比较懵的,看文档可以知道,它的用途是:把回调函数作为微任务,放入事件循环的任务队列中。但这么做的意义是什么呢?

因为 nodejs 并不适合计算密集型的应用,一个进程就一个线程,在当下时间点上,就一个事件在执行。那么,如果我们的事件占用了很多 cpu 时间,那么之后的事件就要等待非常久。所以,nodejs 的一个编程原则是尽量缩短每一个事件的执行事件。process.nextTick 的作用就在这,将一个大的任务分解成多个小的任务。示例代码如下:

// 被拆分成2个函数执行
function BigThing() {
    doPartThing();

    process.nextTick(() => finishThing());
}
로그인 후 복사
로그인 후 복사

在事件循环中,何时执行 nextTick 注册的任务呢?请看下面的代码:

setTimeout(function() {
    console.log("第一个1秒");
    process.nextTick(function() {
        console.log("第一个1秒:nextTick");
    });
}, 1000);

setTimeout(function() {
    console.log("第2个1秒");
}, 1000);

console.log("我要输出1");

process.nextTick(function() {
    console.log("nextTick");
});

console.log("我要输出2");
로그인 후 복사

输出的结果如下,nextTick 是早于 setTimeout:

我要输出1
我要输出2
nextTick
第一个1秒
第一个1秒:nextTick
第2个1秒
로그인 후 복사

在浏览器端,nextTick 会退化成 setTimeout(callback, 0)。但在 nodejs 中请使用 nextTick 而不是 setTimeout,前者效率更高,并且严格来说,两者创建的事件在任务队列中顺序并不一样(请看前面的代码)。

子进程:child_process模块

掌握 nodejs 的 child_process 模块能够极大提高 nodejs 的开发能力,例如主从进程来优化 CPU 计算的问题,多进程开发等等。本文从以下几个方面介绍 child_process 模块的使用:

  • 创建子进程
  • 父子进程通信
  • 独立子进程
  • 进程管道

创建子进程

nodejs 的 child_process 模块创建子进程的方法:spawn, fork, exec, execFile。它们的关系如下:

  • fork, exec, execFile 都是通过 spawn 来实现的。
  • exec 默认会创建 shell。execFile 默认不会创建 shell,意味着不能使用 I/O 重定向、file glob,但效率更高。
  • spawn、exec、execFile 都有同步版本,可能会造成进程阻塞。

child_process.spawn()的使用:

const { spawn } = require("child_process");
// 返回ChildProcess对象,默认情况下其上的stdio不为null
const ls = spawn("ls", ["-lh"]);

ls.stdout.on("data", data => {
    console.log(`stdout: ${data}`);
});

ls.stderr.on("data", data => {
    console.error(`stderr: ${data}`);
});

ls.on("close", code => {
    console.log(`子进程退出,退出码 ${code}`);
});
로그인 후 복사

child_process.exec()的使用:

const { exec } = require("child_process");
// 通过回调函数来操作stdio
exec("ls -lh", (err, stdout, stderr) => {
    if (err) {
        console.error(`执行的错误: ${err}`);
        return;
    }
    console.log(`stdout: ${stdout}`);
    console.error(`stderr: ${stderr}`);
});
로그인 후 복사

父子进程通信

fork()返回的 ChildProcess 对象,监听其上的 message 事件,来接受子进程消息;调用 send 方法,来实现 IPC。

parent.js 代码如下:

const { fork } = require("child_process");
const cp = fork("./sub.js");
cp.on("message", msg => {
    console.log("父进程收到消息:", msg);
});
cp.send("我是父进程");
로그인 후 복사

sub.js 代码如下:

process.on("message", m => {
    console.log("子进程收到消息:", m);
});

process.send("我是子进程");
로그인 후 복사

运行后结果:

父进程收到消息: 我是子进程
子进程收到消息: 我是父进程
로그인 후 복사

独立子进程

在正常情况下,父进程一定会等待子进程退出后,才退出。如果想让父进程先退出,不受到子进程的影响,那么应该:

  • 调用 ChildProcess 对象上的unref()
  • options.detached 设置为 true
  • 子进程的 stdio 不能是连接到父进程

main.js 代码如下:

const { spawn } = require("child_process");
const subprocess = spawn(process.argv0, ["sub.js"], {
    detached: true,
    stdio: "ignore"
});

subprocess.unref();
로그인 후 복사

sub.js 代码如下:

setInterval(() => {}, 1000);
로그인 후 복사

进程管道

options.stdio 选项用于配置在父进程和子进程之间建立的管道。 默认情况下,子进程的 stdin、 stdout 和 stderr 会被重定向到 ChildProcess 对象上相应的 subprocess.stdin、subprocess.stdout 和 subprocess.stderr 流。 这意味着可以通过监听其上的 data事件,在父进程中获取子进程的 I/O 。

可以用来实现“重定向”:

const fs = require("fs");
const child_process = require("child_process");

const subprocess = child_process.spawn("ls", {
    stdio: [
        0, // 使用父进程的 stdin 用于子进程。
        "pipe", // 把子进程的 stdout 通过管道传到父进程 。
        fs.openSync("err.out", "w") // 把子进程的 stderr 定向到一个文件。
    ]
});
로그인 후 복사

也可以用来实现"管道运算符":

const { spawn } = require("child_process");

const ps = spawn("ps", ["ax"]);
const grep = spawn("grep", ["ssh"]);

ps.stdout.on("data", data => {
    grep.stdin.write(data);
});

ps.stderr.on("data", err => {
    console.error(`ps stderr: ${err}`);
});

ps.on("close", code => {
    if (code !== 0) {
        console.log(`ps 进程退出,退出码 ${code}`);
    }
    grep.stdin.end();
});

grep.stdout.on("data", data => {
    console.log(data.toString());
});

grep.stderr.on("data", data => {
    console.error(`grep stderr: ${data}`);
});

grep.on("close", code => {
    if (code !== 0) {
        console.log(`grep 进程退出,退出码 ${code}`);
    }
});
로그인 후 복사

更多node相关知识,请访问:nodejs 教程

위 내용은 Node의 프로세스와 하위 프로세스를 탐색하는 기사의 상세 내용입니다. 자세한 내용은 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에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

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

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

nodejs와 vuejs의 차이점 nodejs와 vuejs의 차이점 Apr 21, 2024 am 04:17 AM

Node.js는 서버측 JavaScript 런타임인 반면, Vue.js는 대화형 사용자 인터페이스를 생성하기 위한 클라이언트측 JavaScript 프레임워크입니다. Node.js는 백엔드 서비스 API 개발, 데이터 처리 등 서버 측 개발에 사용되고, Vue.js는 단일 페이지 애플리케이션, 반응형 사용자 인터페이스 등 클라이언트 측 개발에 사용됩니다.

nodejs는 백엔드 프레임워크인가요? nodejs는 백엔드 프레임워크인가요? Apr 21, 2024 am 05:09 AM

Node.js는 고성능, 확장성, 크로스 플랫폼 지원, 풍부한 생태계, 개발 용이성 등의 기능을 제공하므로 백엔드 프레임워크로 사용할 수 있습니다.

nodejs를 mysql 데이터베이스에 연결하는 방법 nodejs를 mysql 데이터베이스에 연결하는 방법 Apr 21, 2024 am 06:13 AM

MySQL 데이터베이스에 연결하려면 다음 단계를 따라야 합니다. mysql2 드라이버를 설치합니다. mysql2.createConnection()을 사용하여 호스트 주소, 포트, 사용자 이름, 비밀번호 및 데이터베이스 이름이 포함된 연결 개체를 만듭니다. 쿼리를 수행하려면 Connection.query()를 사용하세요. 마지막으로 Connection.end()를 사용하여 연결을 종료합니다.

nodejs의 전역 변수는 무엇입니까 nodejs의 전역 변수는 무엇입니까 Apr 21, 2024 am 04:54 AM

Node.js에는 다음과 같은 전역 변수가 존재합니다. 전역 개체: 전역 핵심 모듈: 프로세스, 콘솔, 필수 런타임 환경 변수: __dirname, __filename, __line, __column 상수: undefine, null, NaN, Infinity, -Infinity

nodejs와 java 사이에 큰 차이가 있나요? nodejs와 java 사이에 큰 차이가 있나요? Apr 21, 2024 am 06:12 AM

Node.js와 Java의 주요 차이점은 디자인과 기능입니다. 이벤트 중심 대 스레드 중심: Node.js는 이벤트 중심이고 Java는 스레드 중심입니다. 단일 스레드 대 다중 스레드: Node.js는 단일 스레드 이벤트 루프를 사용하고 Java는 다중 스레드 아키텍처를 사용합니다. 런타임 환경: Node.js는 V8 JavaScript 엔진에서 실행되는 반면 Java는 JVM에서 실행됩니다. 구문: Node.js는 JavaScript 구문을 사용하고 Java는 Java 구문을 사용합니다. 목적: Node.js는 I/O 집약적인 작업에 적합한 반면, Java는 대규모 엔터프라이즈 애플리케이션에 적합합니다.

nodejs 설치 디렉토리에 있는 npm과 npm.cmd 파일의 차이점은 무엇입니까? nodejs 설치 디렉토리에 있는 npm과 npm.cmd 파일의 차이점은 무엇입니까? Apr 21, 2024 am 05:18 AM

Node.js 설치 디렉터리에는 npm과 npm.cmd라는 두 가지 npm 관련 파일이 있습니다. 차이점은 다음과 같습니다. 확장자가 다릅니다. npm은 실행 파일이고 npm.cmd는 명령 창 바로 가기입니다. Windows 사용자: npm.cmd는 명령 프롬프트에서 사용할 수 있으며, npm은 명령줄에서만 실행할 수 있습니다. 호환성: npm.cmd는 Windows 시스템에만 해당되며 npm은 크로스 플랫폼에서 사용할 수 있습니다. 사용 권장사항: Windows 사용자는 npm.cmd를 사용하고, 기타 운영 체제는 npm을 사용합니다.

nodejs는 백엔드 개발 언어인가요? nodejs는 백엔드 개발 언어인가요? Apr 21, 2024 am 05:09 AM

예, Node.js는 백엔드 개발 언어입니다. 서버 측 비즈니스 로직 처리, 데이터베이스 연결 관리, API 제공 등 백엔드 개발에 사용됩니다.

nodejs와 java 중 어느 것을 선택해야 합니까? nodejs와 java 중 어느 것을 선택해야 합니까? Apr 21, 2024 am 04:40 AM

Node.js와 Java는 각각 웹 개발에 장단점이 있으며 선택은 프로젝트 요구 사항에 따라 다릅니다. Node.js는 실시간 애플리케이션, 신속한 개발 및 마이크로서비스 아키텍처에 탁월한 반면, Java는 엔터프라이즈급 지원, 성능 및 보안에 탁월합니다.

See all articles