Node.js Cronjob场景下所有Promise执行完毕后如何正确退出进程
问题根因
你当前代码提前退出的核心原因是:嵌套在.then()回调里的promises.push(...)是异步执行的,当代码同步执行到if (promises.length > 0)判断时,所有内层的异步回调还没触发,promises数组为空,程序直接跳过等待逻辑执行了process.exit(0),导致大量异步任务未完成就被终止。
优化方案(保留最大并行效率)
只需要把所有异步操作的Promise全部向上层返回,统一收集等待即可,不会引入串行开销,完全匹配你处理60万条记录的性能要求。
优化后代码
// 获取客户数据 const cus_recs = await db.get_customers(); // 并行获取所有客户的匹配规则 const criteria_recs = await Promise.all( cus_recs.map(cus_rec => db.get_criteria(cus_rec)) ); // 全量并行执行所有后续匹配、写入任务,不同任务间无串行等待 const allTasks = cus_recs.flatMap((cus_rec, index) => { const cus_criteria_recs = criteria_recs[index]; return cus_criteria_recs.flatMap(async cus_criteria_rec => { // 单个规则下的依赖步骤按顺序执行,不影响全局并行度 const lis_match_data = await ci.build_lis_match_data(cus_criteria_rec); const lis_recs = await lis.get_matching_listings(cus_criteria_rec, lis_match_data); // 并行处理当前规则下的所有匹配房源 return Promise.all( lis_recs.map(async lis_rec => { await ci.build_lis_match_table(cus_criteria_rec, lis_rec); return lis.do_the_thing(cus_rec, lis_rec); }) ); }); }); // 等待100%任务执行完成后再退出 await Promise.all(allTasks); process.exit(0);
方案说明
- 所有客户、规则、房源维度的任务全部并行发起,仅单个任务内部的依赖步骤用await按顺序执行,和你原设计的并行效率完全一致,无性能损耗
- 用flatMap合并多层Promise数组,避免冗余的数组清空操作,所有任务都能被Promise.all追踪到,不会出现遗漏
- 如果担心并发量过高压垮数据库,可额外引入并发限制逻辑,按需控制同时执行的任务数量
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

