【问题标题】:What is the benefit of async/await if only one thread is available?如果只有一个线程可用,异步/等待有什么好处?
【发布时间】:2020-10-24 18:44:25
【问题描述】:

我是 await/async 范式的 C++ 开发人员,我的理解与我的预期不一致。让我们看看下面的代码:

fs.readFile(fileName, 'utf8', function (err, data) {
   console.log("open");
})

据我了解,fs.readFile 是异步的以避免阻塞。到目前为止一切顺利,但所有教程都明确提到只有 1 线程。那么如何异步执行 I/O 操作,例如如果只有 1 个线程,是否执行另一个异步函数?

让我们假设(仅针对本示例)底层 C 函数 open 阻塞 30 秒。那不会也阻止其他“异步”函数的整个执行吗?但情况似乎并非如此。那么在执行异步代码时真正涉及多少个线程?

我的期望是,它的行为就像一个状态机。这意味着,从概念上讲,只涉及 1 个线程,但从技术上讲不止一个。对吗?

免责声明:我知道“并行!=并发”。

【问题讨论】:

  • 听说过 EventLoop?
  • 是的,如果open() 阻塞,事件循环也会挂起吗?
  • 这将帮助您理解我的想法。 heynode.com/tutorial/…
  • “1”线程部分并不重要。分步任务可能是真正起作用的,但它发生得如此紧密和快速,以至于看起来“平行”。
  • 我会说这取决于您对只有 1 个线程 的看法。特别是操作系统线程为您工作是否考虑单线程?还有非阻塞 IO,有些本质上是异步的(如网络)。

标签: javascript typescript asynchronous async-await


【解决方案1】:

I/O 会在不同的线程中运行,并且大多数 I/O 是非阻塞的。

当人们说 node.js 是 1 个线程时,这意味着在任何给定时间只会执行 javascript 的一部分。但是,如果您正在从磁盘读取文件,则速度很慢,以至于 javascript 有足够的时间安排其他代码运行,而 javascript 等待读取完成。

【讨论】:

  • 谢谢!这让我发疯了,你只是证实了我一直期望的结果,但是当我问“真正涉及多少线程?”时,JS 开发人员常常不明白我的意思。所以从技术上讲,它的工作方式与 Python 和 GIL 类似!非常感谢!
  • 您的陈述是否有任何参考或背景信息?只是为了更深入地了解它
  • 抱歉,我暂时想不出硬性参考。
  • 没问题!你帮了大忙!
猜你喜欢
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
相关资源
最近更新 更多