城市直播房产教育博客汽车
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

JavaScript任务池

3月7日 乱人心投稿
  线程池
  在多线程语言中,我们通常不会随意的在需要启动线程的时候去启动,而是会选择创建一个线程池。所谓线程池,本意其实就是(不止这些作用,其余作用可以自行查阅):节省操作系统资源限制最大线程数。
  对于JavaScript来说,虽然不存在启动线程这种问题,但我们还是可以通过类似的思想,来限制我们做异步操作的数量。分析
  首先我们需要一个数组,用它来存储尚未执行的任务,每个任务都是一个函数,这个函数必须要返回一个Promise。typeTask()Pconsttasks:Task〔〕〔〕;
  其次我们需要一个方法来进行任务的添加。functionaddTask(task:Task):
  最后我们需要一个函数来执行我们所有的task。
  而在这之前,我们还需要定义一个值,来定义同时执行的异步任务的最大数量。functionexecTasks():实现
  根据我们的分析,我们可以写下基础的代码如下:interfaceTaskPool{addTask(task:Task):}typeTask()PfunctionnewTaskPool(max10):TaskPool{consttasks:Task〔〕〔〕;functionaddTask(task:Task):void{}functionexecTasks():void{}}
  新增任务非常简单,我们写出如下代码填充addTask。functionaddTask(task:Task):void{tasks。push(task);}
  接下来就是重头戏。如何实现execTasks方法来限制最大异步任务数量呢?
  首先我们来明确一点,在下面这个场景中,如果foo函数是异步操作,那么是不会阻塞我们的代码执行的。console。log(Before);foo();console。log(After);
  那么我们可以这么操作:定义一个变量用来记录当前的空闲任务数量;执行execTasks时,会选取当前任务数量和空闲任务数二者相比较小的一个;根据该值进行循环,每次循环弹出tasks第一位的任务进行执行;执行前将空闲任务数1,执行完毕后空闲任务数1,并再次执行execTasks。functionexecTasks():void{if(tasks。length0)constexecTaskNumMath。min(tasks。length,leisure);for(leti0;iexecTaskNi){consttasktasks。shift();if(!task)task()。finally((){execTasks();});}}
  最后我们只剩下了一个问题了,我们如何在addTask后执行execTasks,但又不会让下面这种情况导致频繁执行execTasks:for(leti0;i100;i)addTask();
  可以利用防抖setTimeout((){},0)的特性来完成。functionaddTask(task:Task){tasks。push(task);execTasksAfterAdd();}这里借用了lodash的debounce函数,具体实现不多说,可以看我以前的文章:防抖与节流constexecTasksAfterAdddebounce(execTasks);
  完整代码:import{debounce}interfaceTaskQueue{addTask:(task:()Promise)}functionnewTaskQueue(maxTaskNum10):TaskQueue{letleisuremaxTaskNconsttasks:Array()Promise〔〕;functionaddTask(task:()Promise){tasks。push(task);execAfterTask();}constexecAfterTaskdebounce(execTasks);functionexecTasks(){if(tasks。length0)constexecTaskNumMath。min(tasks。length,leisure);for(leti0;iexecTaskNi){consttasktasks。shift();if(!task)task()。finally((){execTasks();});}}return{addTask};}constqueuenewTaskQueue(5);for(leti0;i10;i){queue。addTask(function(){returnnewPromisevoid((resolve){setTimeout(()resolve(),800);});});}使用场景
  其实这种做法的使用场景是比较少的。
  绝大多数情况我们都不需要这么去做,除非碰到很极端的需求。
  例如我们需要用Node。js去设计一个吞吐量极大的服务,那么同时发生大量的网络请求很可能把带宽直接打满,导致后续的请求无法打到该服务,此时就可以使用任务池来控制最大网络请求量。
搜索 投诉 评论 转载

国内首个乘用车无人化运营试点在北京开放来源:人民网原创稿人民网北京4月29日电(记者许维娜)日前,《北京市智能网联车汽车政策先行区乘用车无人化道路测试与示范应用管理实施细则(试行)》(以下简称《实施细则》)发……戴尔32寸8K显示器UP3218KUP3218K是戴尔发布首款的8K液晶显示器,也目前可以买到的唯一一款8K显示器。UP3218K搭载了一块31。5英寸16:9的IPS面板,该款面板分辨率为7680432……死亡循环RX6700XT6600XT帧数测试,附光追FSR画前言《死亡循环》是最近为数不多PS5独占大作,可它偏偏又同时登陆PC平台,这款游戏的媒体均分很高达到88分,再看开发商原来是ArkaneStudios,游戏继承了著名《耻……联想不是你想那样,不该受哪些不白之冤?联想100是中国企业,而且联想初期的决策也是正确的,不然,现在不可能成为全球第一的PC企业。先不要急着上火,且听我慢慢说来。联想的第一大股东是中科院,占股29。04,第二……跟投影仪说再见?诺基亚6000曝光,或成为首款支持投影的手机近日,一组诺基亚新机的爆料信息有点惊艳到我了,也迫不及待想和大家分享一下。据爆料称,这款新机命名为诺基亚6000,其在设计上十分前卫。我们先简单看一下该机的外观,机身正面……12岁男孩制作NFT日入百万,NFT是什么鬼?(附制作教程)前半周我都在忙着研究NFT、区块链和元宇宙的一些概念,接着自己注册数字钱包、制作NFT,还下场买了一些币。对GameFi很感兴趣,找了一些游戏制作的书开始学,期待在未来的某一天……什么原因使得你还买或者用三星?用过三部三星,到现在还没坏,最老的一个7年了,现在还在用第一个原因:三星手机好,做工品质一流都说三星手机贵,这也是不争的事实,但是依旧也是有人买单,别看国内用户少,……5G塑造未来工厂新华社武汉11月20日电题:5G塑造未来工厂新华社记者万芃琦、王贤、李思远轻点鼠标,车间里的重型设备自动开启;打开手机App,生产过程中的各类数据一目了然;实时呈现……终于全部删除了360,你电脑还有360么?昨天把360浏览器卸啦,今天把360卫士也卸啦,流氓他说他来拦截广告,可右下角的广告时不时的弹出,一看来源全是360的,果断放弃,坚决卸载。是因为美国制裁360,所以你才……华硕推出新天选系列台式电脑最高可选RTX3060显卡【CNMO新闻】不管是打游戏还是日常办公,多数用户在条件允许的情况下都会选择使用台式电脑,就性能而言还是台式更加强大,使用起来更加流畅。CNMO了解到,9月22日,华硕官宣了高……JavaScript任务池线程池在多线程语言中,我们通常不会随意的在需要启动线程的时候去启动,而是会选择创建一个线程池。所谓线程池,本意其实就是(不止这些作用,其余作用可以自行查阅):节省操作系统……空调什么时候买最划算?3月到5月是购买空调的最佳时期,超过5月,一方面进入销售旺季,价格会涨,另外一个原因是这个周期购买,可以很快的送货安装,不用等到旺季时挨热,等排队送货安装。空调近几年的变……
Python元组获取元组判定元组比较元组拆包实现方法有哪些主要平时跑步运动用,求佩戴舒适信号稳定音质不差性价比较高的真苹果13最近的粉屏事件大家怎么看Facebook奔向元宇宙,快手走向新市井,他们都有美好的未特斯拉电池供应商LG新能源上市首日估值飙升至990亿美元物联卡为什么不能随意插拔卡?从城市轨道到轨道城市,如何让城市驶向更美好的未来?几十年前的老旧破损照片如何修复?K8S系列第十篇(一键部署MySQL主从复制)苹果X什么新功能?获得20亿融资的摩尔线程推首颗国产全功能GPU,研发用时仅3周受资操盘小米上市,投资字节跳动,连睡觉都是浪费时间
雪花秀哪款气垫好用经典款VS木莲花款难忘的春节优秀小学生日记一个人心累伤感说说短句关于家的经典句子(家的文案)热传聚热点网 从数学到哲学再到物理学给远方妹妹的一封信记新学期的一件事为什么那么多人沉迷于用紫砂壶,你知道想知道的原因在这里虚假的演员请就位台前幕后共同演绎了一场皇帝的新衣皮百褶裙怎么搭配玩转叠穿时髦法图片如何快速去除水印比快倍不止秦岭野生大熊猫唐唐痊愈回家

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找江西南阳嘉兴昆明铜陵滨州广东西昌常德梅州兰州阳江运城金华广西萍乡大理重庆诸暨泉州安庆南充武汉辽宁