Dart的异步真的是异步吗?

时间:2016-11-03 04:02:29

标签: asynchronous dart

给出以下代码

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上看到的行为。当调用异步函数时,它会与其调用者同时执行,但不会与其他异步函数同时执行。我期待异步函数与所有内容并发,而不仅仅是它的调用者。

我希望现在很清楚。

1 个答案:

答案 0 :(得分:6)

这是异步的工作原理。只有一个线程和一个事件队列,其中任务排队。完成先前的同步执行后,将执行队列中的下一个任务。

如果您需要并行执行,您可以利用隔离。

另见

<强>更新

Dart中的代码(当转换为JS时)是单线程执行的。一次只运行一个执行线程。 当任务队列中的任务即将执行时,它将在不中断的情况下执行,直到完成为止。 如果此代码调用异步操作,则会将这些异步调用添加到队列中并在到期时执行。

详细说来,它有点复杂,因为除了事件队列之外还有微任务。在处理任务队列中的下一个任务之前处理微小任务,但是这并没有改变,总是一个任务在另一个任务之后执行而不会中断。

这就是为什么不在UI线程中进行长时间运行计算很重要的原因,因为这会使UI无响应。