JavaScript使用fork拆分任务计算滑动三数和时执行顺序异常问题
问题原因和解决方案
核心问题根源
- fork创建子进程、message事件回调都属于异步操作,会进入Node.js事件队列等待调度,所有同步代码(for循环、循环内的打印逻辑、循环后的其他代码)会优先执行完成,才会触发异步的message回调。所以你在循环内打印
numArrayDef[i]的时候,子进程还没完成运算返回结果,对应位置自然是undefined。 - 直接用push存储结果的逻辑存在缺陷:不同子进程的运算返回速度不固定,返回顺序不一定和你创建子进程的顺序一致,会导致最终数组的顺序和预期的滑动窗口顺序不匹配。
修复代码
parent.js修改后代码
const fs = require('fs'); const { fork } = require('child_process'); const readString = fs.readFileSync('depth_readings_p2.txt', 'utf8'); // 增加空行过滤,避免文件末尾换行产生的无效空字符串导致计算错误 const readArray = readString.split('\n').filter(item => item.trim() !== ''); const totalTask = readArray.length - 2; // 预创建对应长度的结果数组,按索引存值保证顺序正确 const numArrayDef = new Array(totalTask); let finishedCount = 0; for (let i = 0; i < totalTask; i++) { const msg = { i, readArray }; const childProcess = fork('function.js'); childProcess.send(msg); childProcess.on('message', (m) => { numArrayDef[i] = m; finishedCount++; // 所有子进程都返回结果后再打印最终数组 if (finishedCount === totalTask) { console.log('最终求和结果数组:', numArrayDef); } childProcess.kill(); }); }
function.js可优化为(去掉冗余的边界判断,父循环已经保证索引合法)
process.on('message', (msg) => { const num = parseInt(msg.readArray[msg.i]) + parseInt(msg.readArray[msg.i + 1]) + parseInt(msg.readArray[msg.i + 2]); process.send(num); process.exit(); });
内容的提问来源于stack exchange,提问作者Wololegend
相关产品推荐
相关产品推荐

