Dart-任务队列

Dart的消息队列机制

Dart像Android一样,是基于消息驱动的.

依靠eventLoop不停的从队列中获取消息或者事件来驱动整个应用的运行,包括isolate发送过来的消息就是通过Loop处理。

看起来很像Android中的handler+looper+msg机制。

但是不同的是,Android中每个线程只有一个looper对应一个一个MessageQueue,但是dart中存在两个队列

Dart的消息传递过程

Dart在执行完main方法后,就会由loop开始执行两个任务队列中event。

loop会先执行完所有的微服务队列中的所有event,再去执行事件队列中的一个事件,one by one,所以微服务队列的优先级高于事件队列,我们可以利用这项特性来插队:

eg:打印文件内容

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import 'dart:io';

void main(){
  new File("/Users/enjoy/a.txt").readAsString().then((content){
      print(content);
  });

  //死循环造成阻塞
  while(true){}
}

文件内容永远也无法打印出来,因为main函数还没执行完。而then方法是由Loop检查Event queue执行的。

如果需要往微服务中插入Event进行插队:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import 'dart:async';
import 'dart:io';
//结果是先执行了microtask然后执行then方法。
void main(){
  new File("/Users/enjoy/a.txt").readAsString().then((content){
      print(content);
  });
  //future内部就是调用了 scheduleMicrotask
  Future.microtask((){
    print("future: excute microtask");

  });
//  scheduleMicrotask((){
//    print("");
//  });

}

注意:如果微服务中出现阻塞,那么两个队列中所有的后续任务都不会执行,也是因为单线程模型导致。