Dart的异步真的是异步吗?

Gab*_*iel 3 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');
}
Run Code Online (Sandbox Code Playgroud)

它会生成以下输出

done
starting add -> 0
ending add -> 10000000
starting sub -> 10000000
ending sub -> 0
Run Code Online (Sandbox Code Playgroud)

我想知道async调用是否真的以异步方式执行.

看起来所有async方法都在第二个线程中运行,它始终是相同的,因此它们对于调用者来说是异步的,但彼此不是.

我对吗?如果是这样,我如何以非常异步的方式执行多个函数(就像创建新线程一样)?

编辑

我并不是说它必须是平行的.它可以是异步而不是并行的.例如,1核处理器每个周期执行1条指令,但这并不意味着逐个执行这些处理.处理器对所有进程进行插入并同时执行它们,而不是并行执行.具有GIA的VM也具有此行为.

这不是我在Dart VM上看到的行为.当调用异步函数时,它会与其调用者同时执行,但不会与其他异步函数同时执行.我期待异步函数与所有内容并发,而不仅仅是对其调用者.

我希望现在很清楚.

Gün*_*uer 6

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

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

也可以看看

更新

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

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

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