Javascript 如果async/await只是线程的一个包装器,那么为什么它的性能要优于线程呢?

Javascript 如果async/await只是线程的一个包装器,那么为什么它的性能要优于线程呢?,javascript,java,node.js,multithreading,v8,Javascript,Java,Node.js,Multithreading,V8,这个话题一直萦绕在我的脑海里 让我们假设我们有一个典型的web服务器,一个在Node.js中,另一个在Java(或任何其他带有线程的语言)中 为什么仅仅因为使用async/await,node的性能(每秒处理更多基于IO/网络的请求)会比java服务器更好?它不只是一个使用java/c#/c++在幕后使用的相同线程的语法糖吗?异步(asyn/await)对于可能阻塞的活动是必不可少的,例如应用程序访问web时。对web资源的访问有时很慢或延迟。如果此类活动在同步进程中被阻止,则整个应用程序必须等

这个话题一直萦绕在我的脑海里

让我们假设我们有一个典型的web服务器,一个在
Node.js
中,另一个在
Java
(或任何其他带有线程的语言)中


为什么仅仅因为使用async/await,node的性能(每秒处理更多基于IO/网络的请求)会比java服务器更好?它不只是一个使用java/c#/c++在幕后使用的相同线程的语法糖吗?

异步(asyn/await)对于可能阻塞的活动是必不可少的,例如应用程序访问web时。对web资源的访问有时很慢或延迟。如果此类活动在同步进程中被阻止,则整个应用程序必须等待

在异步进程(线程)中,应用程序可以继续执行不依赖于web资源的其他工作,直到潜在阻塞任务完成


尽管您应该理解线程和异步/等待编程之间的区别。

关于异步编程,可用性是关键。例如,一个请求可以分解为更小的任务,即获取内部结果、读取、写入、建立连接等。。。因此,有一半的时间被浪费在等待相关任务上。异步模型使用这段时间来处理其他传入请求,保留回调函数,在队列中注册以保存状态,并可用于其他请求。因此,他们可以处理更多的请求


了解有关处理请求的更多信息:

没有理由期望节点比用Java编写的服务器更快。你为什么认为可能是这样

这里的其他答案(到目前为止)似乎解释了JS中异步编程相对于单线程同步操作的好处——这是显而易见的,但不是问题所在

每个人都同意的关键点是,某些操作天生就很慢(例如:等待网络请求、等待磁盘/数据库访问),在这些操作进行期间,让CPU做其他事情是很有效的。在应用程序中使用多个线程是一种行之有效的方法;但当然,这只在提供线程的语言中才可能。许多传统的服务器实现(在爪哇、C、C++、……)使用每个请求一个线程(或者,等效地,线程池来分配传入请求)。这些线程可以阻止等待,比如说数据库——没关系,操作系统会让等待的线程休眠,同时让CPU在另一个线程上工作(处理另一个请求)。最终结果与使用Node得到的结果非常相似

当然,JavaScript并不能使线程对程序员可用。但是,它有这样一个概念,即使用JavaScript引擎调度请求,并提供在请求完成时调用的回调。这就是整个系统的行为方式,类似于传统的线程编程语言:用户代码可以说“做这件事,然后安排数据库访问,当结果可用时,在这里继续使用这个[回调]代码”,在等待数据库请求时,CPU可以执行一些其他代码。您希望避免的是CPU无所事事地等待,而其他工作等待CPU有时间完成,这两种方法(Java线程和JavaScript回调)都可以实现这一点

最后,async/await(就像承诺一样)实际上只是语法上的糖分,使编写基于回调的代码变得更容易。使用async/await的代码并不比直接使用回调的旧式代码快,只是更漂亮,更不容易出错。它也不比基于Java的(编写良好的)服务器快


Node.js很受欢迎,因为它可以方便地为应用程序的客户端和服务器部分使用相同的语言。从性能的角度来看,它并不比传统的替代方案好,只是也不差(或者至少不差多少;实际上,设计应用程序的效率比用Java还是JavaScript实现更重要)。不要被炒作所吸引:-)

我读了你发送的链接,我知道async/await不会创建后台线程,但如何创建呢?如果你发出DB请求,你必须有一个后台线程来监听响应,不是吗?那么异步/等待线程的好处是什么?(除了更简洁的语法之外)线程可以做更多有用的事情。wait是专门为处理需要时间的事情而设计的,最典型的是I/O请求。这通常是在I/O请求完成时通过回调完成的。编写依赖于这些回调的代码是相当困难的,Wait极大地简化了它。我建议阅读以下内容:“为什么node的性能比java服务器好”——我想不会。你做过基准测试吗?不使用async/await编写异步java服务器是可能的,但它是并行运行的。很好的解释。“使用async/await并不比使用回调的旧式代码快”-这不是试图告诉我们的:-),但是是的,两者都不比另一种更快。