CPU密集型和I / O密集型有什么区别?以及为什么节点js不占用CPU资源

问题描述 投票:-1回答:1

CPU密集型和I / O密集型有什么区别?为什么节点js不占用大量CPU?

javascript node.js performance cpu
1个回答
1
投票

CPU密集型代码占用大量CPU周期。例如,加密/解密或视频转码将成为CPU的沉重负担。

I / O密集型代码使用大量的I / O(通常是网络或磁盘),这些操作大部分已转移到操作系统上。

一般说来,由于nodejs是非阻塞的I / O架构,因此它特别擅长I / O密集型代码。它可以非常有效地同时执行许多I / O操作(比通常为每个I / O操作使用一个单独的线程的体系结构要高得多。)

通常,nodejs在单个线程中运行Java脚本,并且因此仅使用单个内核,因此在做大量占用大量CPU的事情方面做不好,因为它通常不会占用多个CPU内核因此,CPU密集型操作不会并行运行,而是一个接一个地序列化。

此外,由于运行Javascript和事件驱动的体系结构具有单线程特性,当解释器运行CPU密集型操作时,它不能做其他任何事情。其他事情(例如新的网络请求到达您的服务器)必须等到CPU密集型代码完成。 Javascript的多个线程之间没有时间片可以平衡调度。

因此,这种非常高效的非阻塞I / O架构与Javascript的单线程运行相结合,产生了这样一种观念,即nodejs在很多I / O上都是出色的,而在需要大量CPU的操作上却不够出色。

现在,有一些方法可以解决需要大量CPU的操作。较新版本的nodejs具有Worker Threads,因此您现在可以启动尽可能多的线程,并通过将CPU密集型代码移出主线程来提高运行CPU密集型代码的整体性能,从而使其可以自由运行事件循环。并且,您可以使用辅助线程来参与更多的CPU核心,以完成CPU密集型工作。

例如,如果您的应用程序进行了大量的加密,则可能会启动一小组工作线程,然后创建一个加密工作队列。当主JS线程想要进行某种加密时,它将向加密队列提交一个作业,并且池中的一个工作线程将对加密作业进行处理。它将具有一个非阻塞的异步接口,因此主线程将不会被阻塞并且可以自由地做其他事情(例如处理其他请求),并且当工作线程完成后,它将向主线程发送一条消息。线程将得到通知,然后可以访问加密结果而不会阻塞主JS线程。

您还可以使用内置的集群模块来使多个CPU参与处理传入的工作(无论是CPU密集型还是网络密集型)。

© www.soinside.com 2019 - 2024. All rights reserved.