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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:24:03