给出以下代码
import 'dart:async';
var total = 0;
final iterations = 10000000;
Future add() async {
print('starting add -> $total');
for (var i = 0; i < iterations; i++) {
total += 1;
}
print('ending add -> $total');
}
Future sub() async {
print('starting sub -> $total');
for (var i = 0; i < iterations; i++) {
total -= 1;
}
print('ending sub -> $total');
}
void main(List<String> args) {
add();
sub();
print('done');
}
生成以下输出
done
starting add -> 0
ending add -> 10000000
starting sub -> 10000000
ending sub -> 0
我想知道async
调用是否真的以异步方式执行。
看起来所有async
方法都在第二个线程中运行,这个方法总是相同的,所以它们对于呼叫者来说是异步的,但对于彼此不是。
我是对的吗?如果是这样,我如何以非常异步的方式执行多个函数(就像创建新线程一样)?
修改
我并不是说它必须是平行的。它可以是异步而不是并行的。例如,1核处理器每个周期执行1条指令,但这并不意味着逐个执行这些处理。处理器对所有进程进行插入并执行并发,而不是并行执行。带有GIA的VM也有这种行为。
这不是我在Dart VM上看到的行为。当调用异步函数时,它会与其调用者同时执行,但不会与其他异步函数同时执行。我期待异步函数与所有内容并发,而不仅仅是它的调用者。
我希望现在很清楚。
答案 0 :(得分:6)
这是异步的工作原理。只有一个线程和一个事件队列,其中任务排队。完成先前的同步执行后,将执行队列中的下一个任务。
如果您需要并行执行,您可以利用隔离。
另见
<强>更新强>
Dart中的代码(当转换为JS时)是单线程执行的。一次只运行一个执行线程。 当任务队列中的任务即将执行时,它将在不中断的情况下执行,直到完成为止。 如果此代码调用异步操作,则会将这些异步调用添加到队列中并在到期时执行。
详细说来,它有点复杂,因为除了事件队列之外还有微任务。在处理任务队列中的下一个任务之前处理微小任务,但是这并没有改变,总是一个任务在另一个任务之后执行而不会中断。
这就是为什么不在UI线程中进行长时间运行计算很重要的原因,因为这会使UI无响应。