给出以下代码
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
调用是否真的以异步方式执行。
看起来所有异步
方法都在始终相同的第二个线程中运行,因此它们对于调用者来说是异步的,但彼此之间不是异步的。 p>
我说得对吗?如果是这样,我如何以真正的异步方式执行多个函数(就像创建新线程一样)?
编辑
我并不是说它必须是并行的。它可以是异步的,但不是并行的。例如,1核处理器每个周期执行1条指令,但这并不意味着进程是一条一条地执行的。处理器插入所有进程并并发执行它们,而不是并行。具有 GIA 的虚拟机也有此行为。
这不是我在 Dart VM 上看到的行为。当调用异步函数时,它会与其调用者同时执行,但不会与另一个异步函数同时执行。我期望异步函数能够与所有事物并发,而不仅仅是其调用者。
我希望现在一切都清楚了。
最佳答案
这就是异步的工作原理。只有一个线程和一个用于排队任务的事件队列。当上一个同步执行完成后,就会执行队列中的下一个任务。
如果您需要并行执行,您可以利用隔离。
另请参阅
- https://www.dartlang.org/tutorials/language/futures
- https://webdev.dartlang.org/articles/performance/event-loop
更新
Dart 中的代码(以及转换为 JS 时)是单线程执行的。一次仅运行一个执行线程。 当任务队列中的任务需要执行时,它将不间断地执行,直到完成。 如果此代码调用异步操作,这些异步调用将添加到队列中并在到期时执行。
详细来说有点复杂,因为除了事件队列之外还有微任务。微任务在处理任务队列中的下一个任务之前进行处理,但这并没有改变始终一个任务在另一个任务之后执行而不会中断的情况。
这就是为什么不要在 UI 线程中进行长时间运行的计算很重要的原因,因为这会使 UI 无响应。
关于asynchronous - Dart 的异步真的是异步吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40393674/