Node.JS非阻塞IO和其他框架如ASP.NET MVC通过async/await实现非阻塞io。

6
什么是node.js的非阻塞模型和ASP.NET MVC非阻塞async/await与Tasks之间的区别? 我的意思是他们是否以相同的方式成功地解决了相同的问题,或者我错过了什么?我认为其他框架在node之前已经有了相同的解决方案?
2个回答

6
在高层次上,它们是等效的,但有一个主要区别。在Node中,所有请求都由同一线程处理;而在ASP.NET中,所有请求都由线程池处理。Node是单线程异步方法,而ASP.NET是多线程异步(或同步)方法。
因此,Node无法处理同步API,如果有一个本应该是异步的API却不是,Node将会假装它是异步的,通过将其推送到线程池线程上,以便主线程可以继续处理其他请求。
相比之下,ASP.NET从一开始就是多线程的,所以在这个环境中推送同步工作到线程池线程上是一种反模式。
理论上,这意味着ASP.NET在多核服务器上更具可扩展性,但据我所知,没有人证明或否定这一点。Node服务器可以采用的一种缓解方法是在同一服务器上运行多个Node副本,以及负载均衡器(nginx或仅另一个Node副本)。然而,在此时,任何共享状态/缓存都被强制为出站状态。
关于哪个先支持异步,我敢打赌很可能是ASP.NET。自首次发布以来,ASP.NET就支持异步,并且MVC在2.0中增加了支持。然而,在最近发布的.NET 4.5中,使用async和await变得(相对)容易;在那之前,大多数公司都认为这不值得复杂化。

1
据我所知,唯一的区别在于Node.js中非阻塞是执行I/O的唯一方式。而在.NET中,如果您真的想要,可以阻止线程。顺便说一下,这可能有合理的原因。但是,在Node.js中,您实际上没有这个选项。

非阻塞是进行I/O操作的唯一方式,由于这种特性,您无法执行复杂的计算操作。 - Ark
是的,你可以。I/O 是非阻塞的。硬件计算,例如生成质数,默认情况下将同步执行,因此会阻塞整个线程/应用程序。 - RobbyD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接