我最近一直在使用 Node.js 进行开发,并且对事件循环的情况有一个很好的了解。鉴于我有使用 javascript 的经验,Node 对我来说很有意义,但我想知道,有没有人曾经停止使用多线程系统并使用异步来提高性能?或者选择使用异步而不是多线程来提高性能?
什么是异步非阻塞 I/O 在现实世界中战胜多线程的真实例子?
我最近一直在使用 Node.js 进行开发,并且对事件循环的情况有一个很好的了解。鉴于我有使用 javascript 的经验,Node 对我来说很有意义,但我想知道,有没有人曾经停止使用多线程系统并使用异步来提高性能?或者选择使用异步而不是多线程来提高性能?
什么是异步非阻塞 I/O 在现实世界中战胜多线程的真实例子?
无论您是否使用多线程,所有现代操作系统 I/O 操作本质上都是异步的。所以说“异步更快”实际上是不正确的。但是,异步编程允许您以几乎相同的性能保存线程。这在服务器上很重要,因为您可以获得的线程数是有限的(受可用内存限制)。
因此,使用异步不一定会获得更好的性能,但在 I/O 繁重的任务上具有更好的可扩展性。异步甚至可能在 CPU 密集型任务上表现更差,因为您无法从服务器内核之间的并行工作中受益。另一方面,I/O 与不涉及 CPU 的中断和 DMA 一起工作。这就是您获得足够好的性能的方式,因为您可以继续执行直到硬件通过发出中断信号通知您 I/O 完成。
编辑:我只是发现我没有回答你的实际问题。但是,只要您知道异步如何使您受益,您可能就不需要真实世界的示例。只知道:
根据您使用的是 I/O 还是 CPU,更多的异步可能会给您带来更好的可扩展性或更差的性能。通常,Web 应用程序是 I/O 密集型的,这得益于异步编程。
编码更容易,因为您不需要管理多个进程/线程之间的一致性/数据交换。
当只创建一个简单的 Web 应用程序时,这种模型并没有真正的优势,但是当有一个服务器同时管理多个连接时,传递的数据以某种方式捆绑在一起。
性能方面有一些优势,因为拥有多个线程/进程往往比单个线程使用更多的内存。
简单的数学运算:让一个线程处理一个连接,每个线程需要 1MB 的 RAM,很容易计算出在一台计算机上可以连接多少连接。使用 node.js,您有一个处理多个连接的进程,例如,每个新连接需要 20MB 的 RAM 和 4kb。我想你应该已经明白了。
异步 I/O 并不快,但它可以帮助您消耗更少的资源,同时多次执行相同的操作。