当前位置: 首页 > news >正文

react源码学习之Scheduler

简介

Scheduler主要用于调度执行Reconciler

组成

api

  • unstable_scheduleCallback
  • unstable_cancelCallback

调度回调有两种方式

  • setTimeout
  • 通过MessageChannel

Task

为任务调度单元

type Task={id:number,callback:Callback|null,priorityLevel:PriorityLevel,startTime:number,expirationTime:number,sortIndex:number,isQueued?:boolean,};

双堆

维护两个最小堆,按TasksortIndex排序

  • taskQueue:排序键为expirationTimestartTime小于等于当前时间currentTime的任务放入此堆中
  • timerQueue:排序键为startTimestartTime大于当前时间currentTime的任务放入此堆中
vartaskQueue:Array<Task>=[];vartimerQueue:Array<Task>=[];

优先级 到超时时间 的映射

优先级timeout超时时间
ImmediatePriority-1立即超时
UserBlockingPriorityconst userBlockingPriorityTimeout = 250
IdlePrioritymaxSigned31BitInt = 1073741823永远不会超时
LowPriorityconst lowPriorityTimeout = 10000
NormalPriorityconst normalPriorityTimeout = 5000

调度工作循环workLoop

functionworkLoop(initialTime:number){letcurrentTime=initialTime;advanceTimers(currentTime);currentTask=peek(taskQueue);while(currentTask!==null){if(!enableAlwaysYieldScheduler){if(currentTask.expirationTime>currentTime&&shouldYieldToHost()){// This currentTask hasn't expired, and we've reached the deadline.break;}}// $FlowFixMe[incompatible-use] found when upgrading Flowconstcallback=currentTask.callback;if(typeofcallback==='function'){// $FlowFixMe[incompatible-use] found when upgrading FlowcurrentTask.callback=null;// $FlowFixMe[incompatible-use] found when upgrading FlowcurrentPriorityLevel=currentTask.priorityLevel;// $FlowFixMe[incompatible-use] found when upgrading FlowconstdidUserCallbackTimeout=currentTask.expirationTime<=currentTime;if(enableProfiling){// $FlowFixMe[incompatible-call] found when upgrading FlowmarkTaskRun(currentTask,currentTime);}constcontinuationCallback=callback(didUserCallbackTimeout);currentTime=getCurrentTime();if(typeofcontinuationCallback==='function'){// If a continuation is returned, immediately yield to the main thread// regardless of how much time is left in the current time slice.// $FlowFixMe[incompatible-use] found when upgrading FlowcurrentTask.callback=continuationCallback;if(enableProfiling){// $FlowFixMe[incompatible-call] found when upgrading FlowmarkTaskYield(currentTask,currentTime);}advanceTimers(currentTime);returntrue;}else{if(enableProfiling){// $FlowFixMe[incompatible-call] found when upgrading FlowmarkTaskCompleted(currentTask,currentTime);// $FlowFixMe[incompatible-use] found when upgrading FlowcurrentTask.isQueued=false;}if(currentTask===peek(taskQueue)){pop(taskQueue);}advanceTimers(currentTime);}}else{pop(taskQueue);}currentTask=peek(taskQueue);if(enableAlwaysYieldScheduler){if(currentTask===null||currentTask.expirationTime>currentTime){// This currentTask hasn't expired we yield to the browser task.break;}}}// Return whether there's additional workif(currentTask!==null){returntrue;}else{constfirstTimer=peek(timerQueue);if(firstTimer!==null){requestHostTimeout(handleTimeout,firstTimer.startTime-currentTime);}returnfalse;}}

AI数字营销平台

http://www.jsqmd.com/news/1078418/

相关文章:

  • Stable Diffusion提示词工程实战:从结构编码到动态权重调度
  • 可组合型数据团队:AI时代的数据交付新范式
  • TCN理解
  • 闲来做了一个轻量化在线计算器小项目,记录一下开发初衷
  • 5款英文降AI率平台实测推荐
  • 数据治理平台效能升级:五大厂商多智能体协同与全链路自动化水平全景扫描
  • 无监督学习实战地图:聚类、降维、异常检测工业落地指南
  • 翻译公司视频口译八强榜单:视频口译多场景覆盖全
  • 2023大模型工程落地四大拐点:推理优化、多模态对齐、开源分层与应用抽象
  • MongoDB 的 CRUD
  • 文心5.0原生全模态:统一语义空间下的多模态AI实践指南
  • B站直播开了HDR Vivid鸿蒙让手机看直播也有电视画质
  • 老年人健身应用设计:减法思维与技术适老化实践
  • LangGraph图编排原理与实战:构建可调试可扩展AI Agent系统
  • OpenAI与Broadcom联合推出专为AI推理打造的定制芯片Jalapeno
  • Activity Host 作为确定性编排与认知智能代理的桥梁
  • AI漫剧创作工具性价比适配梳理
  • Elasticsearch迁移到Qdrant实战指南:向量搜索性能优化与生产落地
  • 看完就会:盘点2026年好评如潮的的AI智能降重工具
  • gc触发crash,根因却是unsafe
  • 三位科技先驱谈如何与AI建立信任与责任机制
  • Bright Data AI Agent VS 传统爬虫开发
  • 从零搭建小红书爆文分析系统:日均处理 2500 条笔记的工程实践
  • 特征工程中的编码策略与特征选择:从信息泄漏防护到统计检验驱动筛选
  • OpenGL学习笔记-03-VBO/VAO
  • Python实战:Excel箭头取值算法,一次解决上下查找匹配问题
  • 基于SpringBoot的校园社团管理与发展态势分析系统
  • LeetCode 3737.统计主要元素子数组数目 I:枚举+计数
  • 大语言模型(LLM)核心技术与训练全流程解析
  • 星载深度学习实战:深空探测中的模型压缩与实时部署