我正在学习Dart的未来,并阅读了一些关于Future
的文章。
它说Dart是单线程的,我们可以使用Future
来制作一些昂贵的函数,例如:阅读文件。
假设读取文件的成本为10秒,我有3个文件需要阅读。
我的飞镖码:
main() {
readFile("aaa.txt");
readFile("bbb.txt");
readFile("ccc.txt");
print("Will print the content of the files later");
}
readFile(String filename) {
File file = new File(filename);
file.readAsString().then((content) {
print("File content:\n");
print(content);
});
}
由于读取文件的成本为10秒,因此上述代码至少花费30秒,对吧?使用期货来阅读文件只是为了让昂贵的任务一个接一个地运行,而不会阻止当前代码,但不会降低总成本?
如果在java中,我可以创建一个线程池,并使3个未来任务并行运行,总成本将在10到20秒之间。
是否有可能在Dart中做同样的事情?使用Dart的隔离是唯一的解决方案吗?
答案 0 :(得分:3)
我希望这个可以花费10秒,因为它会启动三次读取,每次读取都会将回调排队到"然后"读取完成后的功能。完全有可能三个文件将并行加载,并在10秒后完成。然后,顺序将在主线程上调用回调。
尽管dart中的用户代码是单线程的(假设您不使用隔离专区或Web工作者),但没有任何内容表明实现无法创建线程或使用操作系统的异步加载只要未来在主线程中按顺序运行,就可以并行执行任务。
答案 1 :(得分:2)
这是对的。如果您使用new Timer()
,new Future()
或scheduleMicrotask()
启动新的异步路径,则会将其安排在以后执行。
当您的某个异步路径正在等待网络请求或文件系统返回数据时,另一个异步路径可能会同时跳入并运行。因此,运行时间可能少于30秒,但您无法通过添加CPU来减少运行时间。 我必须承认,我不知道有关何时进行调度以及它如何正常工作的详细信息。
Dart没有线程,所以如果你想并行运行代码,你需要隔离。