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隊列處理
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章