node处理高并发任务

const axios = require("axios");

const chalk = require("chalk");

const { log } = require("console");

async function singleRequest(article_id) {

// 这里我们直接使用 axios 库进行请求

const reply = await axios.post(

"http://www.fq.vpn/index.php",

{

article_id,

}

);

return reply.data;

}

/**

* 执行多个异步任务

* @param {*} fnList 任务列表

* @param {*} max 最大并发数限制

* @param {*} taskName 任务名称

*/

async function concurrentRun(fnList = [], max = 5, taskName = "未命名") {

if (!fnList.length) return;

log(chalk.blue(`开始执行多个异步任务,最大并发数: ${max}`));

const replyList = []; // 收集任务执行结果

const count = fnList.length; // 总任务数量

const startTime = new Date().getTime(); // 记录任务执行开始时间

let current = 0;

// 任务执行程序

const schedule = async (index) => {

return new Promise(async (resolve) => {

const fn = fnList[index];

if (!fn) return resolve();

// 执行当前异步任务

const reply = await fn();

replyList[index] = reply;

log(`${taskName} 事务进度 ${((++current / count) * 100).toFixed(2)}% `);

// 执行完当前任务后,继续执行任务池的剩余任务

await schedule(index + max);

resolve();

});

};

// 任务池执行程序

const scheduleList = new Array(max).fill(0).map((_, index) => schedule(index));

// 使用 Promise.all 批量执行

const r = await Promise.all(scheduleList);

const cost = (new Date().getTime() - startTime) / 1000;

log(chalk.green(`执行完成,最大并发数: ${max},耗时:${cost}s`));

return replyList;

}

(async () => {

const requestFnList = new Array(5).fill("6909002738705629198").map((id) => () => singleRequest(id));

// console.log(new Array(100).fill("6909002738705629198"));

const reply = await concurrentRun(requestFnList, 10, "请求掘金文章");

})();

你可能感兴趣的:(node处理高并发任务)