当前位置: 首页 > 网络应用技术

node.js中的过程和线程

时间:2023-03-06 22:20:49 网络应用技术

  线程和过程是计算机操作系统的基本概念。它们属于程序员中的高频词汇。那么您如何理解?node.js中的过程和线程是什么?

  1.1,专业文本定义1.2,上面的流行理解相对较难,并且在阅读后可能不理解,它不利于理解记忆。然后,让我们举一个简单的例子:

  假设您是一个快递网站的小兄弟。起初,没有多少居民对这个地点负责,您一个人。此事是一一完成的。这称为单个线程。所有的工作必须按顺序实施。该区域中有更多的居民。这是一个线程。网站提供了快递站中使用的小型购物车和其他工具。小伙伴不仅可以为一个人使用它。这称为多线程资源共享。目前只有一个站点推车。每个人都需要使用它。这就是所谓的冲突。有许多解决方案,排队等待或在使用后等待其他兄弟的通知。这称为线程同步。

  总部有许多站点,每个站点的操作模式几乎相同。这就是称为Multi -Process。总部称为主过程,每个站点的过程称为子进程。总部和站点之间,每个站点之间,每个站点,小型购物车都是独立的,不能混合。这被称为过程之间没有共享资源。每个站点可以通过电话和其他方法连接。这称为管道。电台之间还有其他协作方法,以促进完成更大的计算任务。这称为过程之间的处理。

  您还可以查看Ruan Yifeng的过程和线程的简单说明。

  node.js是一个单个线程服务。事件驱动程序和非块I/O模型语言特征使Node.js有效且轻巧。优势是避免频繁的切换线程和资源冲突;擅长于I/O密集型操作(基础模块Libuv是通过通过多个操作系统通过多线程呼叫提供的异步I/O功能来执行的,但服务器端上的node.js可能是数百个node.js每秒请求。当面对CPU密集型请求时,由于它是单个线程模式,因此不可避免地会造成阻塞。

  2.1,node.js使用KOA阻止我们简单地构建Web服务,并使用fibonaccis数字引号模拟Node.js来处理CPU密集型计算任务:

  斐波那契数系列,也称为金段系列,从第三个项目开始,每个项目等于前两个项目:0、1、1、3、5、8、13、21,.....

  执行启动服务,并与Postman发送请求。可以看出,38次计算为617ms。换句话说,由于执行了CPU密集型计算任务,因此Node.js的主线程已被超过600毫秒所阻止。如果同时处理更多请求,或者任务更为复杂,那么所有请求都会更为复杂,那么所有请求这些请求将延迟。

  我们创建另一个新的Axios.js来模拟和发送多个请求。目前,APP.JS中的Fibos数量计算为43,以模拟更复杂的计算任务:

  可以看出,当请求需要执行CPU密集型计算任务时,后续请求将被阻止并等待。服务基本上会被服务所阻止。对于此缺点,Node.js一直在弥补。

  2.2,Master-Workermaster-Worker模式是平行模式。当核心想法是:当系统具有两个或多个流程或线程线程工作时,主负责接收和分发任务,而Worker负责处理任务。

  2.3。多线程线程是CPU调度的基本单元。它只能同时执行线程任务。仅CPU可以调用相同的线程。如果使用多核CPU,则不会使用CPU的性能。

  多线程为我们带来了一种灵活的编程方法,但是我们需要学习更多的API知识。在编写更多代码的同时,有更多的风险。线程的开关和锁将增加系统资源的费用。

  worker_threads是Node.jss提供的多线程API,它对于执行CPU强度计算任务非常有用,并且对I/O密集型操作无济于事,因为Node.js build.js build indynchronous I/o操作比worker_thread更有效。在worker_threads中,ParentPort主要用于次线程和主线程的信息交互。

  稍微更改app.js,然后将CPU密集型计算任务移交给子线程计算:

  添加fibo.js文件以处理复杂的计算任务:

  执行上述Axios.js。目前,APP.JS中的Fibos数量计算为43,以模拟更复杂的计算任务:

  可以看出,当将CPU密集型计算任务移交给子线程处理时,主线程不再被阻止。只要等待子线程处理完成,主线程接收子线程返回的结果,其他请求将不再遭受。在实际开发中,请使用线程池替换上述操作,因为频繁的线程也将具有资源开销。

  该线程是CPU调度的基本单元。它只能同时执行线程任务,并且只能由CPU调用相同的线程。

  当我们回顾一下,本节开头提到的线程和CPU的描述。目前,由于它是一个新线程,因此可以在其他CPU的核心上执行,并且可以完全使用多核CPU。

  2.4。Multi -Process Node.js提供了群集模块,以充分利用CPU的多核功能。群集可以通过一个父进程管理多个子过程来管理群集功能。

  群集的底层是child_process。主过程受到控制。启动代理流程和n个工作过程。代理程序处理一些公共事务,例如日志等;工作过程使用IPC(跨过程间氨酸)通信渠道和主过程。通信,与主过程共享服务端口。

  添加fibo-10.js并模拟10个请求:

  可以看出,仅使用一个过程,慢慢地阻止了10个请求,并且累积时间需要15秒:

  接下来,app.js略微更改并介绍群集模块:

  执行了启动服务后,我们可以看到集群帮助我们创建了一个主流程,而4个工人:::

  通过Fibo-10.js仿真发送10个请求。您可以看到处理10个请求的四个过程需要将近9秒:

  启动10个工作过程时,请查看效果:

  它仅需少于3秒即可,但过程的数量并非无限。在日常开发中,工作过程的数量通常与CPU核心相同。

  2.5。多过程描述多过程的打开不是要处理高和合并,而是解决Node.js的问题。作为通过叉子方法的父进程,但每个过程都是独立的,并且资源不是彼此共享的。由于系统资源是有限的,通常根据CPU核心编号设置了过程数。

  1.大多数通过多线程多进程方案求解CPU密集型计算任务的解决方案可以用多进程方案替换;

  2.尽管Node.js是异步的,但这并不意味着它不会被阻止。最好不要处理主线程上的CPU密集任务,以确保主螺纹的平滑流动;

  3.不要盲目地追求高性能和高级合并,以满足系统的需求,有效和敏捷的是该项目的项目需求。这也是node.js轻量级的特征。

  4. node.js中提到的流程和线程中有许多概念,但未扩展或未提及,例如:libuv,ipc communication channels和node.js底部i/o的多过程,如何保护多过程,如何处理正时任务,代理流程等;

  5.可以在https://github.com/liuxy0551/node-part-thread上查看上述代码。

  原始:https://juejin.cn/post/7094873160398405640