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

wordpress客户端制作宁波seo外包

wordpress客户端制作,宁波seo外包,石家庄信息港,wordpress 安装ftp异步并发控制代码详细分析 完整代码 /*** 控制异步请求并发数的简单函数式实现* param {Array<Function>} tasks - 异步任务数组&#xff0c;每个任务都是返回Promise的函数* param {number} limit - 最大并发数* returns {Promise<Array>} - 所有任务的结果数组…

异步并发控制代码详细分析

完整代码

/*** 控制异步请求并发数的简单函数式实现* @param {Array<Function>} tasks - 异步任务数组,每个任务都是返回Promise的函数* @param {number} limit - 最大并发数* @returns {Promise<Array>} - 所有任务的结果数组(按照添加顺序)*/
function limitConcurrency(tasks, limit) {// 任务结果数组(保持与tasks相同顺序)const results = new Array(tasks.length);// 记录已完成的任务数量let completedCount = 0;// 当前正在执行的任务数量let runningCount = 0;// 下一个要执行的任务索引let nextIndex = 0;return new Promise((resolve) => {// 定义执行下一批任务的函数function runNextTasks() {// 当所有任务都已完成时,返回结果if (completedCount === tasks.length) {resolve(results);return;}// 尝试启动新任务,直到达到并发上限或任务都已分配while (runningCount < limit && nextIndex < tasks.length) {const taskIndex = nextIndex++;const task = tasks[taskIndex];// 增加运行计数runningCount++;// 执行任务并处理结果Promise.resolve(task()).then(result => {// 保存结果到对应位置results[taskIndex] = result;console.log(taskIndex,'taskIndextaskIndex');completedCount++;runningCount--;// 尝试执行更多任务runNextTasks();}).catch(error => {// 错误处理:记录错误并继续results[taskIndex] = { error };completedCount++;runningCount--;// 尝试执行更多任务runNextTasks();});}}// 开始执行任务runNextTasks();});
}// 使用示例:控制5个setTimeout的并发执行
const tasks = [() => new Promise(resolve => setTimeout(() => {console.log('任务1完成');resolve('结果1');}, 5000)),() => new Promise(resolve => setTimeout(() => {console.log('任务2完成');resolve('结果2');}, 1000)),() => new Promise(resolve => setTimeout(() => {console.log('任务3完成');resolve('结果3');}, 1000)),() => new Promise(resolve => setTimeout(() => {console.log('任务4完成');resolve('结果4');}, 1800)),() => new Promise(resolve => setTimeout(() => {console.log('任务5完成');resolve('结果5');}, 1200))
];// 限制并发数为2
limitConcurrency(tasks, 2).then(results => {console.log('所有任务完成,结果:', results);
});

详细执行流程分析

初始状态

  • tasks.length = 5(索引: 0, 1, 2, 3, 4)
  • limit = 2
  • results = [empty × 5]
  • completedCount = 0
  • runningCount = 0
  • nextIndex = 0

第一次调用 runNextTasks()

检查完成条件
if (completedCount === tasks.length) // 0 === 5 → false,继续执行
while循环 - 第一轮
while (runningCount < limit && nextIndex < tasks.length)
// 0 < 2 && 0 < 5 → true,进入循环// 第一次循环:
const taskIndex = nextIndex++; // taskIndex = 0, nextIndex = 1
const task = tasks[taskIndex]; // task = tasks[0](5秒任务)
runningCount++; // runningCount = 1// 启动 taskIndex=0 的任务(5秒延时)
Promise.resolve(task()).then(...)
while循环 - 第二轮
while (runningCount < limit && nextIndex < tasks.length)
// 1 < 2 && 1 < 5 → true,继续循环// 第二次循环:
const taskIndex = nextIndex++; // taskIndex = 1, nextIndex = 2
const task = tasks[taskIndex]; // task = tasks[1](1秒任务)
runningCount++; // runningCount = 2// 启动 taskIndex=1 的任务(1秒延时)
Promise.resolve(task()).then(...)
while循环 - 第三轮
while (runningCount < limit && nextIndex < tasks.length)
// 2 < 2 && 2 < 5 → false,退出while循环

此时状态:

  • 正在执行:taskIndex=0(5秒)、taskIndex=1(1秒)
  • 等待队列:taskIndex=2、taskIndex=3、taskIndex=4
  • runningCount = 2(已达上限)
  • nextIndex = 2

1秒后 - taskIndex=1 完成

Promise.then 回调执行
.then(result => {results[taskIndex] = result; // results[1] = '结果2'console.log(taskIndex,'taskIndextaskIndex'); // 输出: 1 taskIndextaskIndexcompletedCount++; // completedCount = 1runningCount--;   // runningCount = 1(释放一个槽位)runNextTasks();   // 递归调用
})
递归调用 runNextTasks()
// 检查完成条件
if (completedCount === tasks.length) // 1 === 5 → false// while循环
while (runningCount < limit && nextIndex < tasks.length)
// 1 < 2 && 2 < 5 → trueconst taskIndex = nextIndex++; // taskIndex = 2, nextIndex = 3
const task = tasks[taskIndex]; // task = tasks[2](1秒任务)
runningCount++; // runningCount = 2// 启动 taskIndex=2 的任务

此时状态:

  • 正在执行:taskIndex=0(还剩4秒)、taskIndex=2(1秒)
  • 等待队列:taskIndex=3、taskIndex=4
  • completedCount = 1
  • runningCount = 2
  • nextIndex = 3

2秒后 - taskIndex=2 完成

类似地,taskIndex=2 完成后会:

  1. results[2] = '结果3'
  2. completedCount = 2
  3. runningCount = 1
  4. 递归调用启动 taskIndex=3

3.8秒后 - taskIndex=3 完成

taskIndex=3(1800ms)完成后:

  1. results[3] = '结果4'
  2. completedCount = 3
  3. runningCount = 1
  4. 递归调用启动 taskIndex=4

5秒后 - taskIndex=0 完成

taskIndex=0(5000ms)完成后:

  1. results[0] = '结果1'
  2. completedCount = 4
  3. runningCount = 1
  4. 递归调用,但 nextIndex=5,无新任务启动

5.2秒后 - taskIndex=4 完成

taskIndex=4(1200ms,从3.8秒开始)完成后:

  1. results[4] = '结果5'
  2. completedCount = 5
  3. runningCount = 0
  4. 递归调用检查完成条件:completedCount === tasks.length5 === 5 → true
  5. 调用 resolve(results)

时间轴图示

时间 | 正在执行的任务              | 完成的任务 | 等待队列
-----|---------------------------|-----------|------------------
T0   | taskIndex=0, taskIndex=1  |           | 2,3,4
T1   | taskIndex=0, taskIndex=2  | 1         | 3,4
T2   | taskIndex=0, taskIndex=3  | 1,2       | 4
T3.8 | taskIndex=0, taskIndex=4  | 1,2,3     |
T5   | taskIndex=4               | 1,2,3,0   |
T5.2 | 无                        | 1,2,3,0,4 | → resolve

关键变量状态变化

时间点nextIndexrunningCountcompletedCount说明
初始000开始状态
启动后220启动了taskIndex=0,1
T1321taskIndex=1完成,启动taskIndex=2
T2422taskIndex=2完成,启动taskIndex=3
T3.8523taskIndex=3完成,启动taskIndex=4
T5514taskIndex=0完成
T5.2505taskIndex=4完成,resolve

控制台输出顺序

1 taskIndextaskIndex     // T1: taskIndex=1完成
任务2完成
2 taskIndextaskIndex     // T2: taskIndex=2完成
任务3完成
3 taskIndextaskIndex     // T3.8: taskIndex=3完成
任务4完成
0 taskIndextaskIndex     // T5: taskIndex=0完成
任务1完成
4 taskIndextaskIndex     // T5.2: taskIndex=4完成
任务5完成
所有任务完成,结果: ['结果1', '结果2', '结果3', '结果4', '结果5']

核心机制总结

  1. 并发槽位管理:通过 runningCountlimit 控制同时执行的任务数
  2. 动态调度:每个任务完成时立即尝试启动新任务(递归调用 runNextTasks()
  3. 顺序保证:使用闭包中的 taskIndex 确保结果按原数组顺序存储
  4. 流水线执行:不等待批次完成,而是任务完成即补充,最大化并发效率

这种设计实现了受限并发的流水线处理,既控制了资源使用,又保证了高效执行和结果有序性。

http://www.dtcms.com/wzjs/2963.html

相关文章:

  • 购买网站app制作2022拉新推广平台
  • 亚马逊网站特点重庆网页优化seo
  • 网站建设氵金手指专业软文广告发稿
  • 长春好的做网站公司seo关键词排名优化矩阵系统
  • 0基础多久学会网站架构网站统计分析工具的主要功能
  • 网站开发说明书长春百度seo公司
  • 好的做外贸的网站有哪些抖音搜索引擎推广
  • 网站建设哪家公司靠谱军事新闻最新
  • 门户网站建设合同最新新闻事件今天疫情
  • 豪华跑车网站建设游戏推广引流软件
  • 工业app开发平台南京seo优化公司
  • 做专题页的网站seo排名的职位
  • 传奇网站一般怎么做的黑帽seo技术论坛
  • 济南做网站建设站长之家查询的网址
  • 网站超链接网络营销活动推广方式
  • 手机网站制作大约多少钱西安高端网站建设公司
  • 在什么网站做兼职文件外链生成网站
  • 企业网站建设应具备的功能友情链接seo
  • wordpress 输出the id惠东seo公司
  • 个人微商城怎么开通北京百度seo
  • 做网站企业 金坛谷歌google地图
  • 徐州市贾汪区建设局网站搜索引擎营销方法
  • 免费做店招哪个网站好html网页制作动态效果
  • 西宁圆井模板我自己做的网站网络运营培训哪里有学校
  • 俄语在线网站建设百度平台官网
  • 济宁计算机网站建设培训班网站搜索引擎优化主要方法
  • 政府网站建设园林绿化seo网络推广培训
  • 做网站送邮箱免费软文网站
  • 手机app设计网站建设二十条优化
  • 内部购物券网站怎么做seo站长博客