如何通过并行循环测试NodeJS中createConnection函数的锁机制?
测试带锁的createConnection函数并行调用方案
首先,你的createConnection是基于回调的函数,要结合async/await使用,第一步需要把它Promise化,这样才能更好地处理异步流程:
// 将回调式函数转为Promise版本 function createConnectionPromise(user, connectionParams) { return new Promise((resolve, reject) => { createConnection(user, connectionParams, (error, result) => { if (error) { reject(error); } else { resolve(result); } }); }); }
方式一:用Promise.all实现并行调用
这是最直接的并行调用方案,一次性发起50个调用,等待所有调用完成:
async function testParallelConnections() { // 生成50个并行任务 const tasks = Array.from({ length: 50 }, (_, index) => { // 可给每个调用设置不同参数,或使用相同参数 const user = `user_${index}`; const connectionParams = { /* 你的连接参数 */ }; return createConnectionPromise(user, connectionParams); }); try { // 并行执行所有任务,等待全部完成 const results = await Promise.all(tasks); console.log("所有连接创建完成:", results); } catch (error) { console.error("某个连接创建失败:", error); } } // 执行测试 testParallelConnections();
关键说明:
async:标记函数为异步函数,内部可使用await暂停执行await:暂停异步函数,等待Promise完成后再继续执行后续代码Promise.all:接收Promise数组,并行执行所有Promise;全部成功则返回结果数组,任一失败立即抛出错误Array.from:快速生成指定长度的数组,批量创建50个调用任务
方式二:用asyncEach(以工具库实现为例)
如果需要用asyncEach类的工具,可参考以下两种实现:
基于lodash的异步迭代
// 先安装lodash:npm install lodash const _ = require('lodash'); async function testWithAsyncEach() { const testData = Array.from({ length: 50 }, (_, index) => ({ user: `user_${index}`, connectionParams: { /* 你的连接参数 */ } })); // 用map生成Promise数组,再通过Promise.all并行执行 await Promise.all(_.map(testData, async (data) => { await createConnectionPromise(data.user, data.connectionParams); console.log(`连接 ${data.user} 创建完成`); })); console.log("所有并行调用完成"); } testWithAsyncEach();
基于async库的each方法
// 先安装async库:npm install async const async = require('async'); function testWithAsyncLib() { const testData = Array.from({ length: 50 }, (_, index) => ({ user: `user_${index}`, connectionParams: { /* 你的连接参数 */ } })); // async.each会并行执行所有迭代函数 async.each(testData, (data, callback) => { createConnection(data.user, data.connectionParams, callback); }, (error) => { if (error) { console.error("某个连接创建失败:", error); } else { console.log("所有连接创建完成"); } }); } testWithAsyncLib();
核心注意点
- 并行调用的本质是同时发起50个异步请求,你的锁机制需要确保这些请求中同一时间只有一个在执行核心逻辑(HTTP请求部分)
- 若锁是基于内存的单进程变量锁,仅在单进程环境下生效;多进程测试需使用分布式锁
- 测试时可在
createConnection的锁前后添加日志,比如console.log("获取锁:", user)和console.log("释放锁:", user),直观验证锁的生效顺序
内容的提问来源于stack exchange,提问作者Mayank Patel
相关产品推荐
相关产品推荐

