2012-06-15 57 views
3

我最近在Node.js中进行了开发,并且对事件循环发生了什么有个很好的想法。鉴于我有使用javascript的经验,Node对我的使用有意义,但我想知道,有没有人停止使用多线程系统,并进入异步执行?或者选择使用异步而不是多线程来提高性能?异步非阻塞循环与多线程的真实例子?

异步非阻塞I/O在真实世界中胜过多线程的现实生活中的例子是什么?

回答

4

无论您是否执行多线程,所有现代操作系统I/O操作都是天生异步的。所以说“异步更快”并不是真的。但是,异步编程允许您以几乎相同的性能节省线程。这在服务器上很重要,因为您可以获得的线程数量是有限的(受可用内存限制)。

因此,使用异步时,您不一定会获得更好的性能,但对I/O繁重任务的可伸缩性会更好。由于您无法在服务器内核之间进行并行化工作,因此异步操作甚至可能在CPU密集型任务上表现更差。另一方面,I/O适用于不涉及CPU的中断和DMA。这就是为什么你可以获得足够好的性能,因为你可以继续执行,直到硬件通过发信号中断通知你I/O完成。

编辑:我只是想通了,我没有回答你的实际问题。但只要你知道async对你有多大的好处,你可能不需要真实世界的例子。只要知道:

  • 与数据库通信的I/O
  • 读取或写入到磁盘I/O
  • 发送/接收通过网络的包I/O
  • 剩下的就是CPU

根据您是否使用I/O或CPU更多的异步可能会给你很大的可伸缩性或更差的性能。通常,Web应用程序是I/O密集型的,可以从异步编程中受益。

1

编码更容易,因为您不需要管理多个进程/线程之间的一致性/数据交换。
当创建一个简单的Web应用程序时,这个模型没有真正的优势,但是当一个服务器同时管理多个连接时,传递的数据以某种方式连接在一起。

性能方面有一些优点,因为拥有多个线程/进程倾向于使用更多的内存而不是单个线程。
简单的数学运算:有一个线程处理一个连接,每个线程需要1MB的RAM,因此很容易计算出您可以在一台计算机上连接多少个连接。使用node.js,您有一个进程处理多个连接,并且需要例如20MB的RAM和4KB的每个新连接。我想你应该已经明白了。
异步I/O不会更快,但它可以帮助您在同一时间多次执行相同的操作时消耗更少的资源。