有人可以解释/重定向我,Node.js 的异步模型(非阻塞线程)与任何其他语言(例如 c# 处理 I/O 的异步方式)有什么区别。在我看来,两者都是同一型号。请建议。
最佳答案
这两个模型非常相似。有两个主要区别,其中一个很快就会消失(对于“很快”的某些定义)。
一个区别是 Node.js 是异步单线程的,而 ASP.NET 是异步多线程的。这意味着 Node.js 代码可以做出一些简化假设,因为 all 你的代码总是在同一个确切的线程上运行。因此,当您的 ASP.NET 代码 await
时,它可能会在 不同的 线程上恢复,这取决于您避免诸如线程本地状态之类的事情。
然而,同样的差异也是 ASP.NET 的优势,因为这意味着 async
ASP.NET 可以开箱即用地扩展至服务器的全部功能。例如,如果您考虑一台 8 核机器,那么 ASP.NET 可以同时处理(的同步部分)8 个请求。如果您将 Node.js 放在增强型服务器上,那么通常会实际运行 8 个单独的 Node.js 实例并添加诸如 nginx 之类的东西或一个简单的自定义负载均衡器来处理该服务器的路由请求。这也意味着,如果您希望在服务器范围内共享其他资源(例如缓存),那么您也需要将它们移出进程。
另一个主要区别实际上是语言的不同,而不是平台的不同。 JavaScript 的异步支持仅限于回调和 promise ,即使你使用最好的库,当你做任何不平凡的事情时,你仍然会得到非常尴尬的代码。相比之下,C#/VB 中的 async
/await
支持允许您编写非常自然的异步代码(更重要的是,可维护异步代码) .
但是,语言差异正在消失。 JavaScript 的下一个版本将引入生成器,它(连同一个帮助程序库)将使 Node.js 中的异步代码就像现在使用 async
/await
一样自然.如果你现在想玩“即将推出”的东西,生成器是在 V8 3.19 中添加的,它被滚动到 Node.js 0.11.2(Unstable 分支)中。传递 --harmony
或 --harmony-generators
以显式启用生成器支持。
关于Node.js 与 .net 中的异步/等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21336976/