You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过并行循环测试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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 22:02:25