【发布时间】: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