dart 07.1Dart执行模型

Dart 是一种单线程语言

首先我们需要记住

Dart 是单线程的并且Flutter依赖于Dart

  • 重点
    • Dart 同一时刻只执行一个操作,其他操作在该操作之后执行,这表示只要一个操作正在执行它就不会被其他代码中断
    • 同样的如果该操作需要消耗一段时间,那么在操作执行期间应用将被阻塞

Dart 执行模型

那么,Dart 是如何管理事件执行呢

看下dart的 事件循环机制

当启动一个Flutter/Dart 程序时 将创建启动一个新的线程或者进程Dart中叫Isolate这个Iolate 将作为你程序中代码运行的地方,

  • 该Isolate 创建后

      1. dart 会初始化两个先进先出的队列
      • microTaskQueueeventQueue
      1. 初始化完成厚执行mian() 方法
      1. 启动事件循环
  • 在该isolate的整个生命周期中,一个被称为事件循环的东西来决定你的代码执行方式以及顺序(取决与Microtask和Event 队列)

    • 所以一个isolate 包含
      • 一个完整的事件循环机制
      • 两个队列 Microtask,event
  • 事件循环是一种无限循环机制,在程序执行期间如果没有其他代码执行那 事件循环将执行如下操作

    • void eventLoop(){
          while (microTaskQueue.isNotEmpty){
              fetchFirstMicroTaskFromQueue();
              executeThisMicroTask();
              return;
          }
          if (eventQueue.isNotEmpty){
              fetchFirstEventFromQueue();
              executeThisEventRelatedCode();
          }
      }
      
    • 运行时,event loop优先处理microtask queue,直到**microtask queue为空的时候,再开始处理event queue**。

      • event queue不为空的话,一次取一个event执行,执行完后会重新判断microtask是否为空。若不为空则处理microtask任务
  • 示例代码

    • void mian(){ 
          new Future(() {
              print("1");
            });
            Future.microtask(() {
              print('microtask1 可以看出 先运行microtask 对列中的消息');
            });
            new Future(() {
              print("3");
            });
            Future.microtask(() {
              print('microtask2 可以看出 先运行microtask 对列中的消息');
            });
        }
      //microtask1 可以看出 先运行microtask 对列中的消息
      //microtask2 可以看出 先运行microtask 对列中的消息
      //1
      //3
      
  • 那这两个事件队列都是用来干什么的呢

    • ***MicroTask队列 用于非常简短且需要异步执行的内部动作,这些动作需要在其他事情完成之后,在处理Event***队列之前完成.
      • 所以Microtask不能执行太耗时的操作否则会阻塞队列,所以我们应该有线考虑***Event***队列
    • Event队列 适用与以下参考模型
      • 外部事件比如
        • IO
        • 绘制
        • 交互
        • 流处理
        • …等
      • futures
    • 事实上每次外部事件被触发时,要执行的代码都会被Event队列引用
    • 一旦没有任何MicroTask运行,EventLoop会取出Event队列中的第一项并执行它。
    • 注意Future 也通过Event队列处理
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章