Node.js与.net中的Async/await

PKV*_*PKV 47 asynchronous nonblocking node.js async-await

有人可以解释/重定向我,Node.js的异步模型(非阻塞线程)与任何其他语言之间的区别是什么,例如c#处理I/O的异步方式.在我看来,两者都是同一型号.请建议.

Ste*_*ary 79

两种型号都非常相似.有两个主要区别,其中一个很快就会消失(对于"很快"的某些定义).

一个区别是Node.js是异步单线程的,而ASP.NET是异步多线程的.这意味着Node.js代码可以做一些简化的假设,因为所有代码总是在同一个线程上运行.因此,当你的ASP.NET代码await,它可能会在不同的线程上恢复,并且由你来避免线程本地状态之类的事情.

但是,同样的差异也是ASP.NET的优势,因为它意味着asyncASP.NET可以开箱即用地扩展到服务器的全部功能.如果你考虑一个8核机器,那么ASP.NET可以同时处理(同步部分)8个请求.如果你将Node.js放在加强服务器上,那么实际运行8个独立的Node.js实例并添加类似nginx或简单的自定义负载均衡器来处理该服务器的路由请求是很常见的.这也意味着如果您希望在服务器范围内共享其他资源(例如,缓存),那么您还需要将它们移出proc-of-proc.

另一个主要区别实际上是语言的差异,而不是平台.JavaScript的异步支持仅限于回调和承诺,即使你使用最好的库,当你做任何非平凡的事情时,你仍然会得到非常尴尬的代码.相比之下,C#/ VB中的async/ awaitsupport允许您编写非常自然的异步代码(更重要的是,可维护的异步代码).

但是,语言差异正在逐渐消失.JavaScript的下一个版本将引入生成器,它们(以及帮助程序库)将使Node.js中的异步代码与现在使用async/ 一样自然await.如果你想现在玩"即将推出"的东西,在V8 3.19中添加了生成器,它被卷入Node.js 0.11.2(Unstable分支).通过--harmony--harmony-generators明确启用生成器支持.

  • @PKV:ASP.NET上没有UI线程.有一个*请求上下文*,ASP.NET线程池线程*在处理请求时输入*.然后线程*在返回到线程池时退出*请求上下文.`await`将确保方法在相同的*请求上下文*上恢复,而不是相同的*thread*. (12认同)
  • @UpTheCreek:各种图书馆都有各种技术/解决方案; 取决于你想要做什么.复杂性来自于将实际逻辑分成多个延续.这是发电机解决的复杂性. (3认同)

Ash*_*ian 18

Node.js的异步模型和C#的异步/等待模型之间的区别很大.具有Node.js的异步模型类似于C#和.Net中的异步模型,称为基于事件的异步模式(EAP).C#和.Net有3个异步模型,您可以在异步编程模式中阅读它们.C#中最现代的异步模型是基于任务的C#的异步等待关键字,您可以在基于任务的异步模式中阅读它.C#的async/await关键字使异步代码成为线性,让你避免使用"Callback Hell",比其他任何编程语言都要好得多.你只需要尝试一下,之后你永远不会以其他方式去做.您只需编写消耗异步操作的代码,而不必担心可读性,因为它看起来像您编写任何其他代码.请观看此视频:

  1. 异步编程深入研究
  2. ASP.NET中的异步
  3. 了解异步和等待任务

并且,请尝试在C#和Node.js中进行异步操作以进行比较.你会看到差异.

编辑:由于Node.js V8 JavaScript引擎支持ECMAScript 6 Draft中定义的生成器,因此可以轻松避免JavaScript代码中的"Callback Hell".它在JavaScript中为生活带来了某种形式的异步/等待


bil*_*lly 6

使用nodejs,所有请求都进入事件队列.Node的事件循环使用单个线程来处理事件队列中的项目,执行所有非IO工作,并发送到C++线程池(使用javascript回调来管理异步)所有IO绑定工作.然后,C++线程将其结果添加到事件队列中.

与ASP.NET的差异(两者首先适用于允许异步IO的所有Web服务器)是:

  1. ASP.NET 为每个传入请求使用不同的线程,因此您获得了上下文切换的开销
  2. .NET不会强制你使用异步来进行IO绑定工作,所以它不像nodejs那样惯用于IO绑定的api调用实际上是async(带回调)
  3. .NET'"await-async"在编译时添加了一个步骤来添加"回调",因此你可以编写线性代码(没有回调函数传递),与nodejs相比

网上有很多描述节点架构的地方,但这里有一些东西:http://johanndutoit.net/presentations/2013/02/gdg-capetown-nodejs-workshop-23-feb-2013/index.html#1

  • @PKV:[异步I/O不需要线程](http://blog.stephencleary.com/2013/11/there-is-no-thread.html),正如我在博客中描述的那样.这对于Node.js和`async` ASP.NET都是如此. (4认同)
  • @billy:是的,但它仅用于*应该*是异步API但它被忽略并且只有一个同步API的情况.在这种情况下,Node.js将同步API包装在线程池线程中(在OS异步执行实际操作时被阻塞).所以Node.js线程池是一个不完整的API的解决方法; 它通常不用于异步I/O. (2认同)