Flutter--Dart中的異步

以下內(nèi)容從官網(wǎng)得到:
https://webdev.dartlang.org/articles/performance/event-loop

Even-Looper

Dart是單線程模型,也就沒有了所謂的主線程/子線程之分。
Dart也是Event-Looper以及Event-Queue的模型伍纫,所有的事件都是通過EventLooper的依次執(zhí)行。

而Dart的Event Loop就是:

  • 從EventQueue中獲取Event
  • 處理Event
  • 直到EventQueue為空
Event Queue

而這些Event包括了用戶輸入池充,點(diǎn)擊躯保,Timer,文件IO等

Event Type

單線程模型

一旦某個(gè)Dart的函數(shù)開始執(zhí)行贩猎,它將執(zhí)行到這個(gè)函數(shù)結(jié)束熊户,也就是Dart的函數(shù)不會被其他Dart代碼打斷。

Dart中沒有線程的概念吭服,只有isolate嚷堡,每個(gè)isolate都是隔離的,并不會共享內(nèi)存。而一個(gè)Dart程序是在Main isolate的main函數(shù)開始蝌戒,而在Main函數(shù)結(jié)束后串塑,Main isolate線程開始一個(gè)一個(gè)(one by one)的開始處理Event Queue中的每一個(gè)Event。

Main Isolate

Event Queue以及Microtask Queue

Dart中的Main Isolate只有一個(gè)Event Looper北苟,但是存在兩個(gè)Event Queue:Event Queue以及Microtask Queue

Microtask Queue存在的意義是:
希望通過這個(gè)Queue來處理稍晚一些的事情桩匪,但是在下一個(gè)消息到來之前需要處理完的事情。

當(dāng)Event Looper正在處理Microtask Queue中的Event時(shí)候友鼻,Event Queue中的Event就停止了處理了傻昙,此時(shí)App不能繪制任何圖形,不能處理任何鼠標(biāo)點(diǎn)擊彩扔,不能處理文件IO等等

Event-Looper挑選Task的執(zhí)行順序?yàn)椋?/p>

  • 優(yōu)先全部執(zhí)行完Microtask Queue中的Event
  • 直到Microtask Queue為空時(shí)妆档,才會執(zhí)行Event Queue中的Event
Microtask Queue && Event Queue

Dart中只能知道Event處理的先后順序,但是并不知道某個(gè)Event執(zhí)行的具體時(shí)間點(diǎn)借杰,因?yàn)樗奶幚砟P褪且粋€(gè)單線程循環(huán)过吻,而不是基于時(shí)鐘調(diào)度(即它的執(zhí)行只是按照Event處理完,就開始循環(huán)下一個(gè)Event蔗衡,而與Java中的Thread調(diào)度不一樣纤虽,沒有時(shí)間調(diào)度的概念),也就是我們既是指定另一個(gè)Delay Time的Task绞惦,希望它在預(yù)期的時(shí)間后開始執(zhí)行逼纸,它有可能不會在那個(gè)時(shí)間執(zhí)行,需要看是否前面的Event是否已經(jīng)Dequeue济蝉。

異步任務(wù)調(diào)度

當(dāng)有代碼可以在后續(xù)任務(wù)執(zhí)行的時(shí)候杰刽,有兩種方式,通過dart:async這個(gè)Lib中的API即可:

  • 使用Future類王滤,可以將任務(wù)加入到Event Queue的隊(duì)尾
  • 使用scheduleMicrotask函數(shù)贺嫂,將任務(wù)加入到Microtask Queue隊(duì)尾

當(dāng)使用EventQueue時(shí),需要考慮清楚雁乡,盡量避免microtask queue過于龐大第喳,否則會阻塞其他事件的處理

Use Event Queue

使用Future

一般常用的Future構(gòu)造函數(shù):

new Future((){
    //  doing something
});

而一般常用的還有當(dāng)有分治任務(wù)時(shí),需要將一個(gè)大任務(wù)拆成很多小任務(wù)一步步執(zhí)行時(shí)踱稍,就需要使用到Future.then函數(shù)來拆解任務(wù)

void main(){
new Future(() => futureTask)  //  異步任務(wù)的函數(shù)
        .then((m) => "futueTask execute result:$m")  //   任務(wù)執(zhí)行完后的子任務(wù)
        .then((m) => m.length)  //  其中m為上個(gè)任務(wù)執(zhí)行完后的返回的結(jié)果
        .then((m) => printLength(m))
        .whenComplete(() => whenTaskCompelete);  //  當(dāng)所有任務(wù)完成后的回調(diào)函數(shù)
}

int futureTask() {
    return 21; 
}

void printLength(int length) {
    print("Text Length:$length");
}

void whenTaskCompelete() {
    print("Task Complete");
}

當(dāng)任務(wù)需要延遲執(zhí)行時(shí)曲饱,可以使用new Future.delay來將任務(wù)延遲執(zhí)行,而如上所述珠月,只有當(dāng)Main isolate的Event Queue處于Idle的狀態(tài)時(shí)扩淀,才會延遲1s執(zhí)行,否則等待的時(shí)間會比1s長很多

new Future.delayed(const Duration(seconds: 1), () => futureTask);

當(dāng)需要做動畫的時(shí)候啤挎,不要使用Future驻谆,而需要使用animateFrame

PS:

  • Future中的then并沒有創(chuàng)建新的Event丟到Event Queue中,而只是一個(gè)普通的Function Call,在FutureTask執(zhí)行完后胜臊,立即開始執(zhí)行
  • 當(dāng)Future在then函數(shù)先已經(jīng)執(zhí)行完成了氛谜,則會創(chuàng)建一個(gè)task,將該task的添加到microtask queue中区端,并且該任務(wù)將會執(zhí)行通過then傳入的函數(shù)
  • Future只是創(chuàng)建了一個(gè)Event值漫,將Event插入到了Event Queue的隊(duì)尾
  • 使用Future.value構(gòu)造函數(shù)的時(shí)候,就會和第二條一樣织盼,創(chuàng)建Task丟到microtask Queue中執(zhí)行then傳入的函數(shù)
  • Future.sync構(gòu)造函數(shù)執(zhí)行了它傳入的函數(shù)之后杨何,也會立即創(chuàng)建Task丟到microtask Queue中執(zhí)行

使用scheduleMicrotask

在最頂層的調(diào)用關(guān)系中,使用該函數(shù)即可

async.scheduleMicrotask(() => microtask());

void microtask(){
  //  doing something
}

使用isolate以及Worker

當(dāng)有計(jì)算很繁重的任務(wù)時(shí)沥邻,則需要使用isolate或者Worker來執(zhí)行危虱,以保持App對用戶操作的及時(shí)響應(yīng)。Isolate的實(shí)現(xiàn)可能是一個(gè)單獨(dú)的線程唐全,或者一個(gè)單獨(dú)的進(jìn)程埃跷,需要看Dart VM是如何實(shí)現(xiàn)的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末邮利,一起剝皮案震驚了整個(gè)濱河市弥雹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌延届,老刑警劉巖剪勿,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異方庭,居然都是意外死亡厕吉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門械念,熙熙樓的掌柜王于貴愁眉苦臉地迎上來头朱,“玉大人,你說我怎么就攤上這事龄减∠钆ィ” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵欺殿,是天一觀的道長寄纵。 經(jīng)常有香客問我鳖敷,道長脖苏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任定踱,我火速辦了婚禮棍潘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己亦歉,他們只是感情好恤浪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肴楷,像睡著了一般水由。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赛蔫,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天砂客,我揣著相機(jī)與錄音,去河邊找鬼呵恢。 笑死鞠值,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的渗钉。 我是一名探鬼主播彤恶,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鳄橘!你這毒婦竟也來了声离?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瘫怜,失蹤者是張志新(化名)和其女友劉穎抵恋,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宝磨,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡弧关,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唤锉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片世囊。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖窿祥,靈堂內(nèi)的尸體忽然破棺而出株憾,到底是詐尸還是另有隱情,我是刑警寧澤晒衩,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布嗤瞎,位于F島的核電站,受9級特大地震影響听系,放射性物質(zhì)發(fā)生泄漏贝奇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一靠胜、第九天 我趴在偏房一處隱蔽的房頂上張望掉瞳。 院中可真熱鬧毕源,春花似錦、人聲如沸陕习。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冻璃。三九已至,卻和暖如春损合,著一層夾襖步出監(jiān)牢的瞬間俱饿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工塌忽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拍埠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓土居,卻偏偏與公主長得像枣购,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子擦耀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • OC語言基礎(chǔ) 1.類與對象 類方法 OC的類方法只有2種:靜態(tài)方法和實(shí)例方法兩種 在OC中棉圈,只要方法聲明在@int...
    奇異果好補(bǔ)閱讀 4,274評論 0 11
  • 美圖欣賞 Java、Android知識點(diǎn)匯集 Java集合類 ** Java集合相關(guān)的博客** java面試相關(guān) ...
    ElvenShi閱讀 1,745評論 0 2
  • 客戶要求APP中所有數(shù)據(jù)的顯示和輸入使用類似銀行卡賬號字體眷蜓,后來查資料發(fā)現(xiàn)需要自定義字體分瘾,在使用自定義字體之前需要...
    沉默的魚sunny閱讀 3,263評論 0 0
  • 問題 在vivo X5Pro手機(jī)上,點(diǎn)擊微博登錄時(shí)出現(xiàn)崩潰吁系。經(jīng)過分析發(fā)現(xiàn)是微博依賴的so庫在該設(shè)備上缺失導(dǎo)致的德召。 ...
    亞克西閱讀 985評論 0 0
  • 從上周二開始,嗓子難受汽纤,可感冒卻一直隱忍不發(fā)上岗。直到昨天終于如火山一般噴涌而出了,燒38.7度蕴坪。這是有史以來最高溫肴掷。...
    依心室閱讀 207評論 0 1