【问题标题】:Why async/await performs better than threads if it is just a wrapper around them?如果 async/await 只是它们的包装器,为什么它比线程执行得更好?
【发布时间】:2020-08-16 09:12:57
【问题描述】:

这个话题在我脑海里想了很久。

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

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

【问题讨论】:

标签: javascript java node.js multithreading v8


【解决方案1】:

没有理由期望 Node 比用 Java 编写的服务器更快。你认为为什么会这样?

似乎这里的其他答案(到目前为止)正在解释 JS 中的异步编程与单线程同步操作相比的好处——这很明显,但不是问题。

每个人都同意的关键点是某些操作本质上很慢(例如:等待网络请求,等待磁盘/数据库访问),并且在这些操作进行中时让 CPU 执行其他操作是有效的。在应用程序中使用多个线程是一种行之有效的方法。但当然,这只有在给你线程的语言中才有可能。许多传统的服务器实现(在 Java、C、C++ 中......)每个请求使用一个线程(或者,等效地,一个线程池来分发传入的请求)。这些线程可以阻塞等待,比如数据库——没关系,操作系统会让等待的线程进入睡眠状态,同时让 CPU 在另一个线程上工作(处理另一个请求)。最终结果与使用 Node 获得的结果非常相似。

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

最后,async/await(就像 Promises 一样)确实只是语法糖,可以更轻松地编写基于回调的代码。使用 async/await 的代码并不比直接使用回调的旧式代码快,只是更漂亮且不易出错。它也不比(编写良好的)基于 Java 的服务器快。

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

【讨论】:

  • "使用 async/await 并不比使用回调的旧式代码快" - 这不是 v8.dev/blog/fast-async 试图告诉我们的 :-) 但是是的,两者都固有地比另一个快。
【解决方案2】:

Asynchrony(asyn/await) 对于可能阻塞的活动至关重要,例如当您的应用程序访问网络时。访问网络资源有时很慢或延迟。如果这样的活动在同步进程中被阻塞,整个应用程序必须等待。

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

https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2012/hh191443(v=vs.110)?redirectedfrom=MSDN#threads 虽然你应该了解线程和异步/等待编程之间的区别。

【讨论】:

  • 我阅读了您发送的链接,并且我知道 async/await 不会创建后台线程,但是怎么会呢?如果您发出数据库请求,则必须有一个后台线程来监听响应,不是吗?那么异步/等待线程的好处是什么? (除了更简洁的语法)
  • 一个线程可以做更多有用的事情。 Await 专门用于处理需要时间的事情,最典型的是 I/O 请求。传统上是在 I/O 请求完成时通过回调完成的。编写依赖这些回调的代码是相当困难的,await 大大简化了它。
【解决方案3】:

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

了解更多关于处理请求:https://www.youtube.com/watch?v=cCOL7MC4Pl0

【讨论】:

  • 很好的解释。
猜你喜欢
  • 2014-03-13
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 1970-01-01
  • 2017-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多