nodeプロセス間で通信するにはどうすればよいですか?次の記事は、ノード プロセスの通信方法と、これらの通信方法をノードに実装する方法を理解するのに役立ちます。
通信は、実際には開発のすべてのレベルをカバーします。一般的なものには、さまざまな通信プロトコルを介したクライアントとサーバーの通信、RPC 通信、開発プロセス中のさまざまなモジュール間の通信が含まれます。 、メインの電子プロセスとレンダリング プロセス間の通信など;
この記事では主に nodejs (シングルスレッド、マルチスレッド、マルチプロセス) の通信方法を要約します。 、シナリオ、実装などを使用します。
グローバル変数、ローカル変数、共有パラメータ(共有による呼び出し)。
コードを実行する前に、v8 はまず Estree 仕様を通じてコードを抽象構文ツリーに変換し、それから解釈、コンパイル、実行します。抽象構文ツリー内 (抽象構文ツリーについては、私の他のを参照してください)記事), スコープがあり、メモリの読み取りは識別子(変数の名前付け)を段階的に遡って行われます。したがって、2 つのメソッド間でメモリを共有する必要がある場合は、共通のスコープ内にメモリを作成できます。// 主线程 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
1. TCP ソケット;
2. UNIX ドメイン ソケット;
これらの主な違いは、違いは次のとおりです。
TCP Socket适用于单机,C/S架构等.但UNIX Domain Socket只适用于单机。 UNIX Domain Socket不需要经过一系列的网络中转(协议,分包,校验等等),性能更高,稳定性更好。
// 服务端通过net.createServer创建服务,会返回net.Server对象,可以通过返回值进行各种事件监听,端口监听 const net = require('net') net.createServer((server => { server.end(`hello world!\n`) })).listen(3302, () => { console.log(`running ...`) })
const net = require('net') const socket = net.createConnection({port: 3302}) socket.on('data', data => { console.log(data.toString()) })
// 创建进程 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 vb
名前のないパイプの実装は、ファイル記述子を作成して通信する UNIX ドメイン ソケットと同じです。
名前付きパイプは固定ファイル記述子を通じて通信します:
"\\\\.\\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 中国語 Web サイトの他の関連記事を参照してください。