iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >node中进程通信的实现方式有哪些
  • 759
分享到

node中进程通信的实现方式有哪些

2024-04-02 19:04:59 759人浏览 泡泡鱼
摘要

这篇文章主要介绍“node中进程通信的实现方式有哪些”,在日常操作中,相信很多人在node中进程通信的实现方式有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”node中进

这篇文章主要介绍“node中进程通信的实现方式有哪些”,在日常操作中,相信很多人在node中进程通信的实现方式有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”node中进程通信的实现方式有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

node中进程通信的实现方式有哪些

通信其实涵盖开发的各个层面,常见的有客户端和服务端通过各种通信协议进行通信,rpc通信,开发过程中各个模块之间的相互通信,electron主进程和渲染进程之间的通信等等;

本文主要是尝试总结nodejs(单线程多线程,多进程)通信的方式,使用场景,实现等。

通信的实现方式

一般进程通信的实现方式如下:

1、Shared Memory(内存共享);

2、Socket(套接字);

3、管道(非命名管道Pipe, 命名管道FIFO);

4、Signal(信号);

5、Message queue(消息队列);

下面我们看下在node中如何实现这些方式的通信

一、Shared Memory(内存共享)

单机下(客户端内单线程,单进程里多线程,单台服务器内多进程),通过内存共享实现通信的方式最为常见。

Shared Memory(内存共享)-单线程

操作系统层面来看,进程内所有线程内存都是共享的,但前提是需要知道内存的访问地址。

但从语言层面(node或者说是v8的实现层面),我们没有直接接触内存的管理,而是间接从v8提供的语法/api进行内存操作。v8提供三种方式给我们共享内存(也许叫共享变量更恰当):全局变量, 局部变量, 共享传参(call by sharing);

v8在执行代码之前会先将代码通过Estree规范转化为抽象语法树后再进行解释编译执行,在抽象语法树中(关于抽象语法树可查看我另外一篇文章)是有scope的,而内存读取是通过标志符(变量命名)逐级往上回溯查找。所以如果你需要在两个方法之间共享某个内存,可以在他们共同的作用域下进行创建。

Shared Memory(内存共享)-多线程

在客户端环境或node环境,我们都可以实现多线程,两者方式也类似(node通过worker_threads实现,浏览器通过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

Shared Memory(内存共享)-多进程

因为进程启动后内存是无法相互读取的(系统层面的限制),进程之间的内存共享实际是通过新开辟一段shared memory实现的。但node暂时没有支持shared memory,只能通过低级语言来实现,例如: c++实现的 shared-memory-disruptor addon插件(另外文章介绍)。

二、Socket(套接字)

Socket 分两种实现:
1、tcp Socket;
2、UNIX Domain Socket;
两者的主要区别如下:

TCP Socket适用于单机,C/S架构等.但UNIX Domain Socket只适用于单机。  
UNIX Domain Socket不需要经过一系列的网络中转(协议,分包,校验等等),性能更高,稳定性更好。

TCP Socket

概念: TCP Socket是应用层与TCP/IP协议族通信的中间抽象层,是一种操作系统提供的进程间通信机制;

TCP Socket通信应该是我们日常开发(C/S架构)中最常见的通信方式之一,在我们日常开发中最常见的就是各种应用层协议(Http,websocket,rpc,ftp等)的使用,node中http模块也是基于net模块实现的。

注:其实UDP也属于TCP分层(并不是严格的指TCP通信,而是网络通信层中的TCP/IP层),node有提供'dgram'模块来实现,但在实际应用中没有接触过,所以不进行了解。

net

在node中,TCP Socket是由net模块实现的,net模块主要提供了以下功能:

1、上层的IPC支持(实际上是管道通信的实现,后面管道通信再详细说明);

2、net.Server类;

// 服务端通过net.createServer创建服务,会返回net.Server对象,可以通过返回值进行各种事件监听,端口监听
const net = require('net')

net.createServer((server => {
  server.end(`hello world!\n`)
})).listen(3302, () => {
  console.log(`running ...`)
})

3、net.Socket类;

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 vb

三、管道

管道通信分两种,非命名管道和命名管道。
非命名管道的实现方式和UNIX Domain Socket一样,都是通过创建文件描述符进行通信。
命名管道是通过固定的文件描述符进行通信:

"\\\\.\\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(信号)

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的内容可阅读我之前关于进程的文章。

五、Message queue(消息队列)

一开始我以为是Redis,各种MQ之类的基于TCP的消息队列。但其实是操作系统内的消息队列,node暂时没有提供相关的上层接口,需要更底层实现,e.g. svmq

到此,关于“node中进程通信的实现方式有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: node中进程通信的实现方式有哪些

本文链接: https://www.lsjlt.com/news/87682.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • node中进程通信的实现方式有哪些
    这篇文章主要介绍“node中进程通信的实现方式有哪些”,在日常操作中,相信很多人在node中进程通信的实现方式有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”node中进...
    99+
    2024-04-02
  • Android进程间通信的方式有哪些
    Android进程间通信的方式有以下几种:1. Intent:通过Intent对象进行进程间的通信。可以使用隐式Intent在不同的...
    99+
    2023-10-08
    Android
  • Linux进程间的通信方式有哪些
    本篇内容主要讲解“Linux进程间的通信方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux进程间的通信方式有哪些”吧!进程的概念进程是操作系统的概念,每当我们执行一个程序时,对于...
    99+
    2023-06-16
  • Linux进程间通信的方式有哪些
    本文小编为大家详细介绍“Linux进程间通信的方式有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Linux进程间通信的方式有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.管道管道分为有名管道和无名...
    99+
    2023-06-28
  • Linux系统中进程通信方式有哪些
    小编给大家分享一下Linux系统中进程通信方式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.管道管道分为有名管道和无名管道无名管道是一种半双工的通信方式...
    99+
    2023-06-28
  • Node中的进程间通信怎么实现
    这篇“Node中的进程间通信怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Node...
    99+
    2024-04-02
  • Vue.js中有哪些实现组件通信的方式
    这期内容当中小编将会给大家带来有关Vue.js中有哪些实现组件通信的方式,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。什么是Vue组件?组件 (Component) 是 ...
    99+
    2024-04-02
  • vue中有哪些实现组件通信的方式
    本篇文章给大家分享的是有关vue中有哪些实现组件通信的方式,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。vue组件中关系说明:如上图所示, A...
    99+
    2024-04-02
  • 进程通讯的方式有哪些
    本篇内容主要讲解“进程通讯的方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“进程通讯的方式有哪些”吧!进程同步和通信主要是使用QProcess和QSharedMemory,QSystem...
    99+
    2023-06-19
  • qt进程通信的方法有哪些
    Qt进程间通信的方法有以下几种:1. 信号与槽:可以在不同的对象之间发送和接收信号,实现进程间的通信。通过QObject的子类的信号...
    99+
    2023-09-13
    qt
  • vue中实现组件间通信的方式有哪些
    这篇文章给大家介绍vue中实现组件间通信的方式有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。方法一、 props / $emit父组件A通过props的方式向子组件B传递,B t...
    99+
    2024-04-02
  • node实现爬虫的方式有哪些
    有以下几种方式可以使用node实现爬虫: 使用第三方库:可以使用node.js的第三方库如request、cheerio、pup...
    99+
    2024-03-08
    node
  • android中有哪些实现线程间通信的方法
    这篇文章给大家介绍android中有哪些实现线程间通信的方法,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1,通过Handler机制主线程中定义Handler,子线程发消息,通知Handler完成UI更新,Handle...
    99+
    2023-06-15
  • qt进程间通信的方法有哪些
    Qt进程间通信的方法有以下几种: 信号与槽:通过Qt的信号与槽机制,可以在不同的进程之间进行通信。一个进程可以发射信号,另一个进...
    99+
    2023-10-21
    qt
  • Vue实现组件间通信的方式有哪些
    本篇内容主要讲解“Vue实现组件间通信的方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue实现组件间通信的方式有哪些”吧!1、Props 父 >>> 子&...
    99+
    2023-06-25
  • linux进程间的通信方式有哪几种
    这篇文章主要介绍“linux进程间的通信方式有哪几种”,在日常操作中,相信很多人在linux进程间的通信方式有哪几种问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux进程间的通信方式有哪几种”的疑惑有所...
    99+
    2023-06-20
  • Vue中的组件通信方式有哪些
    Vue中的组件通信方式有哪些,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。vue组件中关系说明:如上图所示, A与B、A与C、...
    99+
    2024-04-02
  • vue中有哪些组件通信方式
    这篇文章将为大家详细讲解有关vue中有哪些组件通信方式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1. props和$emit这是最最常用的父子组件通信方...
    99+
    2024-04-02
  • Python multiprocessing进程间通信方式如何实现
    这篇文章主要介绍“Python multiprocessing进程间通信方式如何实现”,在日常操作中,相信很多人在Python multiprocessing进程间通信方式如何实现问题上存在疑惑,小编查阅了各式资料,整理...
    99+
    2023-07-05
  • Vue3的组件通信方式有哪些
    本篇内容主要讲解“Vue3的组件通信方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue3的组件通信方式有哪些”吧!Props父组件传值给子组件(简称:父传子)Props 文档父组件/...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作