NodeJS CPU密集型和I/O密集型有什么区别?

woobm2wo  于 2023-08-04  发布在  Node.js
关注(0)|答案(1)|浏览(151)

CPU intensiveI/O intensive之间有什么区别?
为什么节点js不是CPU密集型的?

0g0grzrc

0g0grzrc1#

CPU密集型是指使用大量CPU周期的代码。例如,加密/解密或视频转码将是CPU的重负载(尽管其中一些现在被卸载到GPU -但仍然是相同的概念)。
I/O密集型是指使用大量I/O(通常是网络或磁盘)的代码,这些操作大多被卸载到操作系统,并且涉及与外部硬件的接口,而不是使用大量CPU。
通常认为nodejs特别擅长I/O密集型代码,因为它是非阻塞的I/O架构。它可以非常高效地同时进行大量的I/O操作(比通常为每个I/O操作使用单独线程的架构更有效)。
一般来说,nodejs在一个线程中运行你的JavaScript,因此只使用一个内核,所以它不擅长做一堆需要大量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密集型还是网络密集型)。

相关问题