node프로세스 간 통신 방법은 무엇인가요? 다음 글은 노드 프로세스의 통신 방법과 이러한 통신 방법을 노드에서 구현하는 방법을 이해하는 데 도움이 될 것입니다.
통신에는 실제로 모든 수준의 개발이 포함됩니다. 일반적인 통신에는 다양한 통신 프로토콜을 통한 클라이언트와 서버 통신, RPC 통신, 개발 프로세스 중 다양한 모듈 간의 상호 통신, 주 전자 프로세스와 렌더링 프로세스 간의 통신이 포함됩니다.
이 문서에서는 주로 nodejs(단일 스레드, 다중 스레드, 다중 프로세스) 통신 방법, 사용 시나리오, 구현 등을 요약하려고 합니다.
일반적인 프로세스 통신은 다음과 같이 구현됩니다.
1. 공유 메모리(메모리 공유)
3.파이프(소켓); 명명된 파이프 FIFO);
4. 신호(signal);
노드에서 이러한 통신 방법을 구현하는 방법을 살펴보겠습니다. )
단일 머신(클라이언트의 단일 스레드, 단일 프로세스의 다중 스레드, 단일 서버의 다중 프로세스)에서는 메모리 공유를 통한 통신이 가장 일반적인 방법입니다.
공유 메모리(메모리 공유) - 단일 스레드운영 체제 수준에서 프로세스의 모든 스레드 메모리가 공유되지만 전제 조건은 메모리의 액세스 주소를 알아야 한다는 것입니다.
,
공유 매개변수(공유에 의한 호출);v8은 코드를 실행하기 전에 먼저 코드를 전송합니다. Estree 사양을 통해 추상 구문 트리로 변환된 후 해석, 컴파일 및 실행됩니다. 추상 구문 트리에는 범위가 있으며(추상 구문 트리에 대한 다른 기사 참조) 메모리 읽기는 식별자(변수)를 통해 이루어집니다. 명명) 레벨별로 다시 검색합니다. 따라서 두 메서드 간에 일부 메모리를 공유해야 하는 경우 공통 범위에서 메모리를 생성할 수 있습니다. 공유 메모리(메모리 공유) - 멀티 스레딩
클라이언트 환경이든 노드 환경이든 멀티 스레딩을 구현할 수 있는데, 두 가지 방식은 비슷합니다(노드는 워커_스레드를 통해 구현하고, 브라우저는 Worker를 통해 구현됩니다. 여기서 메모리 공유는 주로 메모리 작업 API(SharedArrayBuffer)의 도움으로 이루어집니다. 먼저 브라우저 구현의 예를 살펴보겠습니다.
// 主线程 const buffer = new SharedArrayBuffer(1024) const typedArr = new Int16Array(buffer) const newWorker = new Worker('./worker.js') typedArr[0] = 20 newWorker.postMessage(buffer) newWorker.onmessage= (data) => { console.group('[the main thread]'); console.log('Data received from the main thread: %i', typedArr[0]); console.groupEnd(); } // 子线程 addEventListener('message', ({ data }) => { const arr = new Int16Array(data) console.group('[the worker thread]') console.log('Data received from the main thread: %i', arr[0]) console.groupEnd() arr[0] = 18 postMessage('Updated') }) // 结果 [the worker thread] Data received from the main thread: 20 [the main thread] Data received from the main thread: 18
프로세스가 시작된 후에는 메모리를 서로 읽을 수 없기 때문에(시스템 수준 제한) 메모리 공유 프로세스 간 실제로 이는 공유 메모리의 새로운 섹션을 열어 달성됩니다. 그러나 노드는 현재 공유 메모리를 지원하지 않으며 C++로 구현된 공유 메모리 중단 애드온 플러그인(다른 문서에서 설명)과 같은 저수준 언어를 통해서만 구현할 수 있습니다.
2.UNIX 도메인 소켓,
두 가지의 주요 차이점은 다음과 같습니다.TCP Socket适用于单机,C/S架构等.但UNIX Domain Socket只适用于单机。 UNIX Domain Socket不需要经过一系列的网络中转(协议,分包,校验等等),性能更高,稳定性更好。
TCP 소켓 개념: TCP 소켓은 애플리케이션 계층과 TCP/IP 프로토콜 제품군 간의 통신을 위한 중간 추상화 계층입니다. 이는 운영 체제에서 제공하는 프로세스 간 통신 메커니즘입니다.
TCP 소켓 통신은 우리에서 가장 일반적인 통신입니다. 일일 개발(C/S 아키텍처) 일상적인 개발에서 가장 일반적인 방법 중 하나는 다양한 애플리케이션 계층 프로토콜(http, websocket, rpc, ftp 등)을 사용하는 것입니다. 노드의 http 모듈도 기반으로 구현됩니다. net 모듈에서.
// 服务端通过net.createServer创建服务,会返回net.Server对象,可以通过返回值进行各种事件监听,端口监听 const net = require('net') net.createServer((server => { server.end(`hello world!\n`) })).listen(3302, () => { console.log(`running ...`) })3, net.Socket class;
const net = require('net') const socket = net.createConnection({port: 3302}) socket.on('data', data => { console.log(data.toString()) })
UNIX Domain Socket
UNIX Domain Socket은 파일 디스크립터를 생성하고 서로 다른 프로세스 간의 통신은 읽기 및 읽기를 통과합니다. 통신을 위해 이 파일 디스크립터를 작성합니다(생성 프로세스와 기타 프로세스로 나눌 수 있으며, 다른 프로세스 간의 상호 통신은 생성 프로세스를 중계로 통할 수 있음). e.g.// 创建进程 const net = require('net') const unixSocketServer = net.createServer(server => { server.on('data', data => { console.log(`receive data: ${data}`) }) }) unixSocketServer.listen('/tmp/test', () => { console.log('listening...') }) // 其他进程 const net = require('net') const socket = net.createConnection({path: '/tmp/test'}) socket.on('data', data => { console.log(data.toString()) }) socket.write('my name is vb') // 输出结果 listening... receive data: my name is vb3. PipelinePipeline 통신은 Non-Named Pipe와 Named Pipe 두 가지로 나누어집니다.
"\\\\.\\pipe\\" + PIPE_NAME;
源码可参考stackoverflow(https://stackoverflow.com/questions/11750041/how-to-create-a-named-pipe-in-node-js)
目前理解的管道通信和UNIX Domain Socket实现基本一致,只是管道通信规范了读写权限,半双工通信,UNIX Domain Socket更加自由一些。
Signal是操作系统在终止进程前给进程发送的信号。在node中可以通过process.kill(pid, signal)/child_process.kill(pid, signal)接口实现,e.g.
// 要被终止的http守护进程 const Koa = require('koa') const app = new Koa() app.listen(3004, () => { console.log(`process pid is : ${process.pid}`) // process pid is : 75208 }) // 操作进程 process.kill(75208, 'SIGHUP') // 'SIGHUP'是一般结束进程的信号,还有更多其他的信号参考 [标识](https://blog.csdn.net/houjixin/article/details/71430489)
但这里的前提是你需要获取到被终止的进程pid,更多pid的内容可阅读我之前关于进程的文章。
一开始我以为是redis,各种MQ之类的基于TCP的消息队列。但其实是操作系统内的消息队列,node暂时没有提供相关的上层接口,需要更底层实现,e.g. svmq
更多node相关知识,请访问:nodejs 教程!!
위 내용은 노드에서 프로세스 통신의 여러 구현 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!