【发布时间】:2021-07-18 06:13:15
【问题描述】:
我是 Dart/Flutter 的新手,并且有一些 Node.js 背景,我知道 Dart 与 Node.js 有一些相似之处,比如事件循环和单线程。但是我很难理解 Dart 是如何处理 async 来阻塞 I/O 操作的,尤其是像文件系统和数据库操作这样的内部 I/O。
对于 Node.js,当它处理阻塞 I/O 时,假设是读取文件的内容。它将文件系统操作放在Thread Pool 中,Node.js 然后在主线程中并发(非并行)运行下一行代码,同时文件系统操作继续运行。当它完成读取文件时,它会在Event Queue 中放置一个读取文件回调事件,该事件将由Event Loop 出列并在主线程中执行。 Node.js 的概念不难理解,但 Dart 呢?
由于 Dart 没有 Thread Pool 或类似 Node.js 的东西,它是单线程的,官方网站说它在主线程中运行所有东西,无论是找到 Future、async 还是类似的东西,它仍然在主线程中运行,当它完成该操作时,它会将回调放入Event Queue 等待被Event Loop 出列并在主线程中执行。
这让我感到困惑,Dart 仍然可以在文件系统操作(阻塞 I/O)仍在运行时运行下一行代码。请看这段代码
File myFile = File("some-text-file");
myFile.readAsString().then((content) {
print(content);
});
print("This is my next line");
输出:
This is my next line
Lorem ipsum...
如果不使用 Thread Pool 或类似于 Node.js 的东西不阻塞 I/O 操作,这怎么可能?如果是 Node.js,myFile.readAsString() 将委托给Thread Pool 进行并发。
或者 Dart 确实在底层只是为阻塞 I/O 操作生成了一个新的Isolate?
提前感谢您的所有回答。
【问题讨论】:
标签: multithreading flutter dart