cloudfunctions/ClearingRedundantFolders/node_modules/@cloudbase/manager-node/lib/utils/parallel.js
(开头部分) 2KB这里只显示每个文件的开头 60 行。登录后可以解锁完整代码。
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AsyncTaskParallelController = void 0;
/**
* 异步任务并发控制器,以一定的并发数执行所有任务
* 不具备队列性质,异步任务随机执行
* 单个任务异常,错误会返回,单不会退出执行
* 所有任务执行
*/
class AsyncTaskParallelController {
constructor(maxParallel, checkInterval = 20) {
this.tasks = [];
this.maxParallel = Number(maxParallel) || 20;
this.checkInterval = checkInterval;
}
loadTasks(tasks) {
this.tasks.push(...tasks);
this.totalTasks = this.tasks.length;
}
push(task) {
this.tasks.push(task);
this.totalTasks = this.tasks.length;
}
// 开始执行任务
async run() {
// 存储任务执行结果
const results = [];
// 记录已经运行的任务
const taskHasRun = [];
// 记录任务是否执行完成
const taskDone = [];
// 当前正在运行的任务数量
let runningTask = 0;
return new Promise(resolve => {
// 使用定时器,不阻塞线程
const timer = setInterval(() => {
// 全部任务运行完成
const taskDoneLength = taskDone.filter(item => item).length;
if (runningTask === 0 && taskDoneLength === this.totalTasks) {
clearInterval(timer);
resolve(results);
}
// 当前运行任务数超过最大并发,不再执行新的任务
if (runningTask >= this.maxParallel) {
return;
}
// 遍历任务列表,开始执行还没有执行的任务
this.tasks.forEach((task, index) => {
if (!taskHasRun[index] && runningTask < this.maxParallel) {
runningTask++;
taskHasRun[index] = 1;
task()
.then(res => {
results[index] = res;
})
.catch(err => {
results[index] = err;
})
.then(() => {
runningTask--;
后面还有 9 行代码,购买后查看完整代码
24 小时内免费解锁 3 个项目,之后 1 积分/个。 规则说明
AI 解读
登录后可用,每次 10 积分,解读结果公开显示在下面。
还没有人解读过这个文件。
