목차
Process
프로세스 통신
ipc, rpc, lpc
전자 프로세스 통신
nodejs
总结
웹 프론트엔드 JS 튜토리얼 Node.js와 Electron이 프로세스 간 통신하는 방법에 대해 자세히 알아보세요.

Node.js와 Electron이 프로세스 간 통신하는 방법에 대해 자세히 알아보세요.

Jul 26, 2021 am 10:11 AM
electron node.js 프로세스 커뮤니케이션

이 글에서는 Node.js와 Electron 간의 프로세스 통신 원리를 살펴보고, Electron이 어떻게 통신을 처리하는지, nodejs의 child_process와 클러스터가 어떻게 통신을 처리하는지 소개하고, 프로세스 통신의 본질을 이해합니다.

Node.js와 Electron이 프로세스 간 통신하는 방법에 대해 자세히 알아보세요.

프런트엔드가 프로세스 통신을 이해해야 하는 이유:

프론트엔드 필드는 더 이상 브라우저에서 실행되는 페이지 작성뿐만 아니라 전자, nodejs 등도 담당하며 두 기술 모두 마스터링이 필요합니다. 프로세스 커뮤니케이션.

nodejs는 브라우저와 달리 프로세스 및 스레드 관련 API를 포함하여 운영 체제 기능을 캡슐화하는 많은 API를 확장합니다. 프로세스 API를 학습하려면 프로세스 간 통신 메커니즘을 배워야 합니다.

electron은 chromium과 nodejs를 기반으로 하는 데스크톱 개발 솔루션입니다. 그 아키텍처는 주요 프로세스이며 여러 렌더링 프로세스도 필요합니다. 전자의 프로세스 통신 메커니즘을 배워야 합니다. [추천 학습: "nodejs Tutorial"]

이 글에서는 프로세스 커뮤니케이션에 대해 더 자세히 살펴보겠습니다.

이 기사에서는 다음 지식 포인트를 설명합니다.

  • 프로세스란 무엇입니까?
  • 로컬 프로세스 통신의 네 가지 방법
  • ipc, lpc, rpc는 무엇입니까
  • electron은 프로세스 통신을 어떻게 수행합니까?
  • child_process 및 Cluster of nodejs 프로세스 통신
  • 프로세스 통신의 본질

Process

우리가 작성한 코드는 하드웨어 리소스를 더 잘 활용하기 위해 운영 체제에서 실행되어야 하며, 운영 체제는 여러 프로그램의 동시성을 지원하고 하드웨어 자원의 사용, 할당 단위는 프로세스이고, 이 프로세스는 프로그램의 실행 프로세스입니다. 예를 들어, 프로그램이 어떤 단계를 실행했는지, 어떤 하드웨어 리소스가 적용되었는지, 어떤 포트가 사용되었는지 등을 기록합니다.

프로세스에는 실행될 코드, 코드에 의해 작동되는 데이터, 프로세스 제어 블록 PCB(Processing Control Block)가 포함됩니다. 왜냐하면 프로그램은 데이터 세트에 대한 코드의 실행 프로세스이고 프로세스의 상태이기 때문입니다. 실행 프로세스와 요청된 리소스는 데이터 구조(PCB)에 기록되어야 합니다. 따라서 프로세스는 코드, 데이터, PCB로 구성됩니다.

Node.js와 Electron이 프로세스 간 통신하는 방법에 대해 자세히 알아보세요.

pcb는 pid, 실행된 코드 주소, 프로세스 상태(차단, 실행 중, 준비 등)는 물론 통신에 사용되는 세마포어, 파이프, 메시지 큐와 같은 데이터 구조를 기록합니다.

Node.js와 Electron이 프로세스 간 통신하는 방법에 대해 자세히 알아보세요.

코드 생성부터 지속적인 실행, 하드웨어 리소스(메모리, 하드디스크 파일, 네트워크 등) 적용까지 프로세스가 중간에 차단될 수 있으며, 실행 후 결국 프로세스가 소멸됩니다. 이것이 프로세스의 생명주기입니다.

프로세스는 요청된 리소스에만 독점적입니다. 각 프로세스는 자신의 리소스에만 액세스할 수 있습니다. 그러면 프로세스는 어떻게 서로 통신합니까?

프로세스 통신

프로세스마다 사용 가능한 메모리가 다르기 때문에 중간 매체를 통해 통신해야 합니다.

Semaphore

숫자로 표시되고 PCB의 속성에 배치되는 간단한 표시인 경우 이를 Semaphore라고 합니다. 신호량을 통해 구현됩니다. 信号量,比如锁的实现就可以通过信号量。

这种信号量的思想我们写前端代码也经常用,比如实现节流的时候,也要加一个标记变量。

管道

但是信号量不能传递具体的数据啊,传递具体数据还得用别的方式。比如我们可以通过读写文件的方式来通信,这就是管道,如果是在内存中的文件,叫做匿名管道,没有文件名,如果是真实的硬盘的文件,是有文件名的,叫做命名管道。

文件需要先打开,然后再读和写,之后再关闭,这也是管道的特点。管道是基于文件的思想封装的,之所以叫管道,是因为只能一个进程读、一个进程写,是单向的(半双工)。而且还需要目标进程同步的消费数据,不然就会阻塞住。

这种管道的方式实现起来很简单,就是一个文件读写,但是只能用在两个进程之间通信,只能同步的通信。其实管道的同步通信也挺常见的,就是 stream 的 pipe 方法。

消息队列

管道实现简单,但是同步的通信比较受限制,那如果想做成异步通信呢?加个队列做缓冲(buffer)不就行了,这就是消息队列

이 세마포어 아이디어는 프런트 엔드 코드를 작성할 때도 자주 사용됩니다. 예를 들어 조절을 구현할 때 마커 변수도 추가해야 합니다.

Pipeline

하지만 세마포어는 특정 데이터를 전송할 수 없으며 특정 데이터를 전송하려면 다른 방법을 사용해야 합니다. 예를 들어 파일을 읽고 쓰는 방식으로 통신할 수 있습니다. 이것이 파이프라인입니다. 메모리에 있는 파일이면 익명 파이프라고 하며 파일 이름이 없습니다. 실제 하드디스크에는 Named Pipe라는 파일이 있습니다. 🎜🎜파일을 먼저 열고 읽고 쓴 다음 다시 닫아야 하는 것도 파이프라인의 특징입니다. 파이프는 파일이라는 개념을 기반으로 캡슐화됩니다. 단방향(반이중)이므로 하나의 프로세스에서만 읽고 쓸 수 있기 때문에 파이프라고 합니다. 또한 대상 프로세스도 데이터를 동기식으로 소비해야 합니다. 그렇지 않으면 차단됩니다. 🎜🎜이 파이프라인 방법은 구현이 매우 간단하지만 파일 읽기 및 쓰기이지만 두 프로세스 간의 통신에만 사용할 수 있으며 동기식으로만 통신할 수 있습니다. 실제로 파이프의 동기식 통신도 매우 일반적이며 이는 스트림의 파이프 방식입니다. 🎜🎜🎜🎜Message Queue🎜🎜🎜🎜파이프라인 구현은 간단하지만 동기 통신은 상대적으로 제한적입니다. 큐를 버퍼로 추가하면 됩니다. 이것이 메시지 큐입니다. 🎜🎜메시지 큐도 두 프로세스 간의 통신이지만 파일 기반 아이디어를 기반으로 하지 않지만 단방향이지만 어느 정도 비동기 특성을 가지며 많은 메시지를 넣어 모두 소비할 수 있습니다. 한 번. 🎜🎜🎜🎜공유 메모리🎜🎜🎜

파이프라인과 메시지 큐가 두 프로세스 사이에 있으면 어떻게 될까요?

우리는 共享内存라는 여러 프로세스에서 작동할 수 있는 메모리를 적용하여 이러한 방식으로 통신할 수 있습니다. 각 프로세스는 이 메모리에 데이터를 읽고 쓸 수 있으며 이는 상대적으로 효율적입니다.

공유 메모리는 효율적이고 여러 프로세스 간의 통신에 사용할 수 있지만 여러 프로세스가 읽고 쓸 수 있기 때문에 모두 좋은 것은 아니므로 혼동되기 쉽습니다. 제어할 프로세스의 세마포어(표시 변수)입니다.

공유 메모리는 중간 매체를 거치지 않고 여러 프로세스 간 통신에 적합하므로 더 효율적이지만 사용하기가 더 복잡합니다.

위에서 언급한 방법은 로컬 프로세스 통신을 위한 거의 모든 방법입니다. 로컬을 추가하는 이유는 무엇입니까?

ipc, rpc, lpc

프로세스 통신은 ipc(Inter-Process Communication)입니다. 두 프로세스는 한 컴퓨터에 속할 수도 있고 네트워크에 있는 다른 컴퓨터의 프로세스일 수도 있으므로 두 가지 처리 방법이 있습니다. 통신 :

로컬 프로시저 호출 LPC(로컬 프로시저 호출), 원격 프로시저 호출 RPC(원격 프로시저 호출).

로컬 프로시저 호출은 위에서 언급한 세마포어, 파이프, 메시지 대기열 및 공유 메모리의 통신 방법입니다. 그러나 네트워크에 있는 경우 실제로는 다음과 같은 네트워크 프로토콜을 통해 통신해야 합니다. http, 웹소켓.

그러므로 누군가 ipc를 언급한다면 로컬과 원격이라는 두 가지 방식으로 논의할 수 있는 프로세스 통신에 대해 이야기하는 것입니다.

원격은 네트워크 프로토콜을 기반으로 캡슐화되는 반면, 로컬은 세마포어, 파이프, 메시지 큐 및 공유 메모리(electron 및 nodejs와 같은)를 기반으로 캡슐화됩니다. 이에 대해서는 다음에 설명하겠습니다.

전자 프로세스 통신

electron은 먼저 기본 프로세스를 시작한 다음 BrowserWindow를 통해 렌더링 프로세스를 생성하고 렌더링을 위한 HTML 페이지를 로드합니다. 두 프로세스 간의 통신은 Electron이 제공하는 ipc API를 통해 이루어집니다.

ipcMain, ipcRenderer

메인 프로세스에서는 ipcMain의 on 메소드를 통해 이벤트를 모니터링합니다

import { ipcMain } from 'electron';

ipcMain.on('异步事件', (event, arg) => {
  event.sender.send('异步事件返回', 'yyy');
})
로그인 후 복사

렌더링 프로세스에서는 ipcRenderer의 on 메소드를 통해 이벤트를 모니터링하고, send를 통해 메시지를 보냅니다

import { ipcRenderer } from 'electron';

ipcRender.on('异步事件返回', function (event, arg) {
  const message = `异步消息: ${arg}`
})

ipcRenderer.send('异步事件', 'xxx')
로그인 후 복사

api는 비교적 사용이 간단합니다. C++ 계층이 캡슐화되어 JS의 이벤트 형식 API에 노출되는 프로세스입니다.

어떤 메커니즘에 기반을 두고 있는지 생각해 볼 수 있나요?

분명히 어느 정도 비동기적인 성격이 있고, 상위 프로세스와 하위 프로세스 간의 통신이므로 메시지 큐 형식으로 구현됩니다.

remote

전자는 이벤트 기반 API 외에도 원격 메소드 호출 RMI(원격 메소드 호출) API도 제공합니다.

사실 이는 메시지를 더욱 캡슐화한 것입니다. 즉, 전달된 메시지에 따라 다른 메소드를 호출하는 것입니다. 형식적으로는 이 프로세스의 메소드를 호출하는 것과 같지만 실제로는 메시지를 전송하여 수행됩니다. 다른 프로세스로, ipcMain, ipcRenderer 형식은 본질적으로 동일합니다.

예를 들어 렌더링 프로세스에서 원격을 사용하여 기본 프로세스에서만 사용할 수 있는 BrowserWindow API를 직접 호출할 수 있습니다.

const { BrowserWindow } = require('electron').remote;

let win = new BrowserWindow({ width: 800, height: 600 });
win.loadURL('https://github.com');
로그인 후 복사

요컨대 전자의 상위-하위 프로세스 통신 방식은 메시지 큐 캡슐화를 기반으로 합니다. 하나는 ipcMain과 ipcRenderer의 API를 통해 사용되는 이벤트 방식입니다. 메소드 호출(rmi) 역시 하단의 메시지를 기반으로 하지만 원격 메소드를 실행하지만 로컬 메소드를 실행하는 것처럼 보입니다.

nodejs

nodejs는 child_process와 Cluster라는 두 가지 모듈을 사용하여 프로세스 생성을 위한 API를 제공합니다. 분명히 하나는 상위-하위 프로세스의 생성 및 통신을 위한 것이고, 다른 하나는 다중 프로세스를 위한 것입니다.

child_process

child_process는 다양한 프로세스를 생성하는 데 사용되는 generate, exec, execFile 및 fork API를 제공합니다.

spawn, exec

셸을 통해 명령을 실행하려면 다음을 사용하세요. 생성 또는 실행. 일반적으로 명령을 실행하려면 반환 값이 필요하기 때문에 두 API는 값을 반환하는 방식이 다릅니다.

spawn은 데이터 이벤트를 통해 검색된 스트림을 반환하고 exec는 사용하기 더 간단하지만 maxBuffer를 초과할 수 있는 버퍼로 더 나누어집니다.

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

var app = spawn('node','main.js' {env:{}});

app.stderr.on('data',function(data) {
  console.log('Error:',data);
});

app.stdout.on('data',function(data) {
  console.log(data);
});
로그인 후 복사

실제로 exec는 spwan을 기반으로 캡슐화되어 있으며 간단한 시나리오에서 사용할 수 있습니다. 때로는 maxBuffer를 설정해야 합니다.

const { exec } = require('child_process'); 

exec('find . -type f', { maxBuffer: 1024*1024 }(err, stdout, stderr) => { 
    if (err) { 
        console.error(`exec error: ${err}`); return; 
    }   
    console.log(stdout); 
});
로그인 후 복사

execFile

명령 실행 외에도 실행 파일을 실행하려면 execFile api를 사용하세요.

const { execFile } = require('child_process'); 

const child = execFile('node', ['--version'], (error, stdout, stderr) => { 
    if (error) { throw error; } 
    console.log(stdout); 
});
로그인 후 복사

fork

js를 실행하려면 fork를 사용하세요.

const { fork } = require('child_process');	

const xxxProcess = fork('./xxx.js');	
xxxProcess.send('111111');	
xxxProcess.on('message', sum => {	
    res.end('22222');	
});
로그인 후 복사
로그인 후 복사

요약

child_process의 네 가지 API에 대한 간략한 요약:

셸 명령을 실행하려면 generate와 exec를 사용하여 스트림을 반환하고 exec는 버퍼에 추가로 캡슐화됩니다. exec가 때때로 maxBuffer를 설정해야 한다는 점을 제외하면 차이가 없습니다.

실행 파일을 실행하려면 execFile을 사용하세요.

js 파일을 실행하려면 포크를 사용하세요.

child_process 的进程通信

说完了 api 我们来说下 child_process 创建的子进程怎么和父进程通信,也就是怎么做 ipc。

pipe

首先,支持了 pipe,很明显是通过管道的机制封装出来的,能同步的传输流的数据。

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

const find = spawn('cat', ['./aaa.js']);
const wc = spawn('wc', ['-l']);  find.stdout.pipe(wc.stdin);
로그인 후 복사

比如上面通过管道把一个进程的输出流传输到了另一个进程的输入流,和下面的 shell 命令效果一样:

cat ./aaa.js | wc -l
로그인 후 복사

message

spawn 支持 stdio 参数,可以设置和父进程的 stdin、stdout、stderr 的关系,比如指定 pipe 或者 null。还有第四个参数,可以设置 ipc,这时候就是通过事件的方式传递消息了,很明显,是基于消息队列实现的。

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

const child = spawn('node', ['./child.js'], {
    stdio: ['pipe', 'pipe', 'pipe', 'ipc'] 
}); 
child.on('message', (m) => { 
    console.log(m); 
}); 
child.send('xxxx');
로그인 후 복사

而 fork 的 api 创建的子进程自带了 ipc 的传递消息机制,可以直接用。

const { fork } = require('child_process');	

const xxxProcess = fork('./xxx.js');	
xxxProcess.send('111111');	
xxxProcess.on('message', sum => {	
    res.end('22222');	
});
로그인 후 복사
로그인 후 복사

cluster

cluster 不再是父子进程了,而是更多进程,也提供了 fork 的 api。

比如 http server 会根据 cpu 数启动多个进程来处理请求。

import cluster from 'cluster';
import http from 'http';
import { cpus } from 'os';
import process from 'process';

const numCPUs = cpus().length;

if (cluster.isPrimary) {
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
} else {
  const server = http.createServer((req, res) => {
    res.writeHead(200);
    res.end(&#39;hello world\n&#39;);
  })
  
  server.listen(8000);
  
  process.on(&#39;message&#39;, (msg) => {
    if (msg === &#39;shutdown&#39;) {
       server.close();
    }
  });
}
로그인 후 복사

它同样支持了事件形式的 api,用于多个进程之间的消息传递,因为多个进程其实也只是多个父子进程的通信,子进程之间不能直接通信,所以还是基于消息队列实现的。

共享内存

子进程之间通信还得通过父进程中转一次,要多次读写消息队列,效率太低了,就不能直接共享内存么?

现在 nodejs 还是不支持的,可以通过第三方的包 shm-typed-array 来实现,感兴趣可以看一下。

https://www.npmjs.com/package/shm-typed-array

总结

进程包括代码、数据和 PCB,是程序的一次执行的过程,PCB 记录着各种执行过程中的信息,比如分配的资源、执行到的地址、用于通信的数据结构等。

进程之间需要通信,可以通过信号量、管道、消息队列、共享内存的方式。

  • 信号量就是一个简单的数字的标记,不能传递具体数据。

  • 管道是基于文件的思想,一个进程写另一个进程读,是同步的,适用于两个进程。

  • 消息队列有一定的 buffer,可以异步处理消息,适用于两个进程。

  • 共享内存是多个进程直接操作同一段内存,适用于多个进程,但是需要控制访问顺序。

这四种是本地进程的通信方式,而网络进程则基于网络协议的方式也可以做进程通信。

进程通信叫做 ipc,本地的叫做 lpc,远程的叫 rpc。

其中,如果把消息再封装一层成具体的方法调用,叫做 rmi,效果就像在本进程执行执行另一个进程的方法一样。

electron 和 nodejs 都是基于上面的操作系统机制的封装:

  • elctron 支持 ipcMain 和 ipcRenderer 的消息传递的方式,还支持了 remote 的 rmi 的方式。

  • nodejs 有 child_process 和 cluster 两个模块和进程有关,child_process 是父子进程之间,cluster 是多个进程:

    • child_process 提供了用于执行 shell 命令的 spawn、exec,用于执行可执行文件的 execFile,用于执行 js 的 fork。提供了 pipe 和 message 两种 ipc 方式。

    • cluster 也提供了 fork,提供了 message 的方式的通信。

当然,不管封装形式是什么,都离不开操作系统提供的信号量、管道、消息队列、共享内存这四种机制。

ipc 是开发中频繁遇到的需求,希望这篇文章能够帮大家梳理清楚从操作系统层到不同语言和运行时的封装层次的脉络。

原文地址:https://juejin.cn/post/6988484297485189127

作者:zxg_神说要有光

更多编程相关知识,请访问:编程视频!!

위 내용은 Node.js와 Electron이 프로세스 간 통신하는 방법에 대해 자세히 알아보세요.의 상세 내용입니다. 자세한 내용은 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)

Node의 메모리 제어에 관한 기사 Node의 메모리 제어에 관한 기사 Apr 26, 2023 pm 05:37 PM

Non-Blocking, Event-Driven 기반으로 구축된 Node 서비스는 메모리 소모가 적다는 장점이 있으며, 대규모 네트워크 요청을 처리하는데 매우 적합합니다. 대규모 요청을 전제로 '메모리 제어'와 관련된 문제를 고려해야 합니다. 1. V8의 가비지 수집 메커니즘과 메모리 제한 Js는 가비지 수집 기계에 의해 제어됩니다.

Node V8 엔진의 메모리와 GC에 대한 자세한 그래픽 설명 Node V8 엔진의 메모리와 GC에 대한 자세한 그래픽 설명 Mar 29, 2023 pm 06:02 PM

이 기사는 NodeJS V8 엔진의 메모리 및 가비지 수집기(GC)에 대한 심층적인 이해를 제공할 것입니다. 도움이 되기를 바랍니다.

Node의 파일 모듈에 대해 자세히 이야기해 보겠습니다. Node의 파일 모듈에 대해 자세히 이야기해 보겠습니다. Apr 24, 2023 pm 05:49 PM

파일 모듈은 파일 읽기/쓰기/열기/닫기/삭제 추가 등과 같은 기본 파일 작업을 캡슐화한 것입니다. 파일 모듈의 가장 큰 특징은 모든 메소드가 **동기** 및 ** 두 가지 버전을 제공한다는 것입니다. 비동기**, sync 접미사가 있는 메서드는 모두 동기화 메서드이고, 없는 메서드는 모두 이기종 메서드입니다.

최고의 Node.js Docker 이미지를 선택하는 방법에 대해 이야기해 볼까요? 최고의 Node.js Docker 이미지를 선택하는 방법에 대해 이야기해 볼까요? Dec 13, 2022 pm 08:00 PM

Node용 Docker 이미지를 선택하는 것은 사소한 문제처럼 보일 수 있지만 이미지의 크기와 잠재적인 취약점은 CI/CD 프로세스와 보안에 상당한 영향을 미칠 수 있습니다. 그렇다면 최고의 Node.js Docker 이미지를 어떻게 선택합니까?

Node.js 19가 공식적으로 출시되었습니다. Node.js의 6가지 주요 기능에 대해 이야기해 보겠습니다! Node.js 19가 공식적으로 출시되었습니다. Node.js의 6가지 주요 기능에 대해 이야기해 보겠습니다! Nov 16, 2022 pm 08:34 PM

Node 19가 정식 출시되었습니다. 이 글에서는 Node.js 19의 6가지 주요 기능에 대해 자세히 설명하겠습니다. 도움이 되셨으면 좋겠습니다!

Node.js의 GC(가비지 수집) 메커니즘에 대해 이야기해 보겠습니다. Node.js의 GC(가비지 수집) 메커니즘에 대해 이야기해 보겠습니다. Nov 29, 2022 pm 08:44 PM

Node.js는 GC(가비지 수집)를 어떻게 수행하나요? 다음 기사에서는 이에 대해 설명합니다.

Node의 이벤트 루프에 대해 이야기해 봅시다. Node의 이벤트 루프에 대해 이야기해 봅시다. Apr 11, 2023 pm 07:08 PM

이벤트 루프는 Node.js의 기본 부분이며 메인 스레드가 차단되지 않도록 하여 비동기 프로그래밍을 가능하게 합니다. 이벤트 루프를 이해하는 것은 효율적인 애플리케이션을 구축하는 데 중요합니다. 다음 기사는 Node.js의 이벤트 루프에 대한 심층적인 이해를 제공할 것입니다. 도움이 되기를 바랍니다!

노드가 npm 명령을 사용할 수 없으면 어떻게 해야 합니까? 노드가 npm 명령을 사용할 수 없으면 어떻게 해야 합니까? Feb 08, 2023 am 10:09 AM

노드가 npm 명령을 사용할 수 없는 이유는 환경 변수가 올바르게 구성되지 않았기 때문입니다. 해결 방법은 다음과 같습니다. 1. "시스템 속성"을 엽니다. 2. "환경 변수" -> "시스템 변수"를 찾은 다음 환경을 편집합니다. 3. nodejs 폴더의 위치를 ​​찾습니다. 4. "확인"을 클릭합니다.

See all articles