0

我编写的脚本有一个问题,该脚本用于比较两个非常长的列表,我正在使用节点工作线程来加快速度,问题是我无法让工作人员正确完成。

这是我的工人代码。

const workerFirst = workerData[0];
const workerLast = workerData[workerData.length-1];
const limiter = workerLast - workerFirst +1;

console.log(workerFirst, workerLast, limiter)

const diff = async () => {

    const today = await mergeDB.find({"userComputer.operating system":{$in: ["Microsoft Windows NT Workstation 10.0", "Microsoft Windows NT Workstation 10.0 (Tablet Edition)"]}}).sort({"program name": 1}).limit(limiter).skip(workerFirst)
    const yesterday = await mergeDB_backup.find({"userComputer.operating system":{$in: ["Microsoft Windows NT Workstation 10.0", "Microsoft Windows NT Workstation 10.0 (Tablet Edition)"]}}).sort({"program name": 1})

    var timestamp = new Date()

    console.log("starting work " + workerFirst +"-"+workerLast+" @  " + timestamp)

    let softwareChange = [];

    var theSame = 0;
    var newRecord = 0;

    for (var i = 0; i < today.length; i++) {

        var flag = 0;

        var machineid = today[i]["machineid"];
        var machineName = today[i]["userComputer"][0]["name"];
        var programName = today[i]["program name"];
        var version = today[i]["version"];
        var status = today[i]["Status"]

        for (var n = 0; yesterday.length > n; n++) {

            var machineidBak = yesterday[n]["machineid"];
            var programNameBak = yesterday[n]["program name"];
            var versionBak = yesterday[n]["version"];
            var statusBak = yesterday[n]["Status"]

            if (programName == programNameBak && status == statusBak) {
                theSame++
                flag = 1;
                break
            }
        }
        if (flag == 0) {
                softwareChange.push( {
                    timestamp:new Date,
                    machineid,
                    machineName,
                    programName,
                    version,
                    status
                });
                 newRecord++;
        }
    }
        await NewSoftware.insertMany(softwareChange)
        
        console.log("Worker "+ workerFirst +"-"+workerLast+" finished @ " + new Date());
        console.log(newRecord);

       await mongoose.connection.close();
       process.exit();

}

diff()
  .catch(console.log);

现在的问题是,如果我process.exit()在代码中留下一些工作线程不会完成他们被杀死的代码。一些线程确实设法输出了console.log("Worker "+ workerFirst +"-"+workerLast+" finished @ " + new Date());一些没有,并且没有一个线程设法输出,console.log(newRecord);但代码将完成,然后将继续工作程序生成文件中的代码。如果我省略了 process.exit() 工作人员工作正常,我会看到所有 console.logs 但代码将永远不会结束,我必须手动终止脚本(ctrl+ C)。

任何人都可以看到发生这种情况的明显原因吗?

4

0 回答 0