偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

不用一行代碼,搞懂React調(diào)度器原理

開發(fā) 前端
taskQueue的生產(chǎn)(從timerQueue中移入或執(zhí)行scheduleCallback生成)到消費(fèi)的過程(即圖中灰色部分),這是個(gè)異步循環(huán),taskQueue的具體消費(fèi)過程(即workLoop方法的執(zhí)行),這是個(gè)同步循環(huán).

[[442072]]

大家好,我卡頌。

Scheduler(調(diào)度器)[1]是React重要的組成部分。

同時(shí),他也是個(gè)獨(dú)立的包,任何「連續(xù)、可中斷」的流程都可以用Scheduler來調(diào)度,比如:

  1. const work = {count: 100}; 
  2.  
  3. function doWork(work) { 
  4.   work.count--; 
  5.   console.log('do work!'

work滿足兩個(gè)條件:

  1. 工作是連續(xù)的。一共需要執(zhí)行100次,每次執(zhí)行時(shí)調(diào)用doWork
  2. 工作是可中斷的。中斷恢復(fù)后,接著中斷前的work.count繼續(xù)執(zhí)行就行

滿足這兩個(gè)條件的工作都可以用Scheduler來調(diào)度。

調(diào)度后,Scheduler內(nèi)部會(huì)生成對(duì)應(yīng)task,并在正確的時(shí)機(jī)執(zhí)行task.callback:

  1. const task1 = { 
  2.   // 過期時(shí)間 等于 當(dāng)前時(shí)間 + 優(yōu)先級(jí)對(duì)應(yīng)時(shí)間 
  3.   expirationTime: currentTime + priority, 
  4.   callback: doWork.bind(nullwork

本文會(huì)講解Scheduler的實(shí)現(xiàn)原理。知道你不喜歡看大段的代碼,所以本文沒有一行代碼。文末有Scheduler的源碼地址,感興趣的話可以去看看。

開整~

工作流程概覽

Scheduler的工作原理如下圖,接下來會(huì)詳細(xì)解釋:

在Scheduler中有兩個(gè)容易混淆的概念:

1.delay

delay代表「task需要延遲執(zhí)行的時(shí)間」。配置了delay的task會(huì)先進(jìn)入timerQueue中。

當(dāng)delay對(duì)應(yīng)時(shí)間到期后,該task會(huì)轉(zhuǎn)移到taskQueue中。

2.expirationTime

expirationTime代表「task的過期時(shí)間」。

不是所有task都會(huì)配置delay,沒有配置delay的task會(huì)直接進(jìn)入taskQueue。這就導(dǎo)致taskQueue中可能存在多個(gè)task。

如何決定哪個(gè)task.callback先執(zhí)行呢?Scheduler根據(jù)task.expirationTime作為排序依據(jù),值越小優(yōu)先級(jí)越高。

如果task.expirationTime小于當(dāng)前時(shí)間,不僅優(yōu)先級(jí)最高,而且task.callback的執(zhí)行不會(huì)被中斷。

總結(jié)一下task的幾種情況:

  1. 配置delay且delay未到期:task一定不會(huì)執(zhí)行
  2. 配置delay且到期,或者未配置delay的task,同時(shí)task.expirationTime未到期:根據(jù)task.expirationTime排序后,按順序執(zhí)行

task.expirationTime到期的task:優(yōu)先級(jí)最高,且同步、不可中斷

工作流程詳解

將流程概覽圖替換為Scheduler中具體方法后,如下:

完整工作流程如下:

1.執(zhí)行Scheduler.scheduleCallback生成task

根據(jù)「是否傳遞delay參數(shù)」,生成的task會(huì)進(jìn)入timerQueue或taskQueue。

2.當(dāng)timerQueue中第一個(gè)task延遲的時(shí)間到期后,執(zhí)行advanceTimers將「到期的task」從timerQueue中移到taskQueue中

其中,timerQueue、taskQueue的數(shù)據(jù)結(jié)構(gòu)為小頂堆實(shí)現(xiàn)的優(yōu)先級(jí)隊(duì)列。

3.接下來,執(zhí)行requestHostCallback方法,他會(huì)在新的宏任務(wù)中執(zhí)行workLoop方法

「在宏任務(wù)中執(zhí)行回調(diào)」的方法很多,Scheduler在瀏覽器環(huán)境默認(rèn)使用MessageChannel實(shí)現(xiàn)。

如果不支持MessageChannel,會(huì)降級(jí)到setTimeout。Node或老版IE下會(huì)使用setImmediate。

4.workLoop方法會(huì)循環(huán)消費(fèi)taskQueue中的task(即執(zhí)行task.callback),直到滿足如下條件之一,中斷循環(huán):

  • taskQueue中不存在task
  • 時(shí)間切片用盡

5.循環(huán)中斷后,如果taskQueue不為空,則進(jìn)入步驟3。如果timerQueue不為空,則進(jìn)入步驟2

總結(jié)

總結(jié)一下,Scheduler的完整執(zhí)行流程包括兩個(gè)循環(huán):

taskQueue的生產(chǎn)(從timerQueue中移入或執(zhí)行scheduleCallback生成)到消費(fèi)的過程(即圖中灰色部分),這是個(gè)異步循環(huán)

taskQueue的具體消費(fèi)過程(即workLoop方法的執(zhí)行),這是個(gè)同步循環(huán)

如果你想了解「React中如何使用Scheduler」,可以參考100行代碼實(shí)現(xiàn)React核心調(diào)度功能

參考資料

[1]Scheduler(調(diào)度器):

https://github.com/facebook/react/blob/main/packages/scheduler/src/forks/Scheduler.js

 

責(zé)任編輯:姜華 來源: 魔術(shù)師卡頌
相關(guān)推薦

2021-08-31 09:49:37

CPU執(zhí)行語言

2021-02-01 11:30:13

React前端調(diào)度

2021-12-16 06:21:16

React組件前端

2016-12-02 08:53:18

Python一行代碼

2013-11-29 13:14:30

代碼網(wǎng)頁設(shè)計(jì)

2017-04-05 11:10:23

Javascript代碼前端

2014-02-12 13:43:50

代碼并行任務(wù)

2022-04-09 09:11:33

Python

2020-12-08 06:20:00

Python自動(dòng)化工具開源

2017-04-13 19:20:18

Python代碼并行任務(wù)

2021-11-02 16:25:41

Python代碼技巧

2020-08-19 10:30:25

代碼Python多線程

2020-09-09 16:00:22

Linux進(jìn)程

2025-04-28 09:06:00

2023-09-12 10:10:57

開發(fā)者工具開源

2020-08-12 14:54:00

Python代碼開發(fā)

2019-12-25 14:08:50

Pandas數(shù)據(jù)計(jì)算

2020-09-28 12:34:38

Python代碼開發(fā)

2020-07-15 09:40:37

代碼Python瀏覽記錄

2021-02-24 14:30:59

JavaScript語言開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)