0

为什么相同的同步代码在工作线程中运行时会得到不同的结果?当我从工作线程文件调用时,日志会延迟。

主文件:

const { Worker } = require('worker_threads')

function runService(workerData) {
  return new Promise((resolve, reject) => {
    const worker = new Worker('./service.js', { workerData });
    worker.on('message', resolve);
    worker.on('error', reject);
    worker.on('exit', (code) => {
      if (code !== 0)
        reject(new Error(`Worker stopped with exit code ${code}`));
    })
  })
}

async function run() {
  const result = await runService('world')
  console.log(new Date().toLocaleTimeString('en-US') +" " + result.waitedTime + "ms");
}

console.log(new Date().toLocaleTimeString('en-US') +" Before worker thread (from main.js)")
run().catch(err => console.error(err))
console.log(new Date().toLocaleTimeString('en-US') + " After worker thread (from main.js)")

服务文件:

const { workerData, parentPort } = require('worker_threads')

function syncWait(sec){
    var start = Date.now() 
    var now = start 
    while(now-start < (sec*1000)){
        now=Date.now()
    }
    return (now-start)
}

console.log(new Date().toLocaleTimeString('en-US') + " before wait (from service.js)")
let waitedTime = syncWait(3)
console.log(new Date().toLocaleTimeString('en-US') + " after 1st wait (from service.js)")
console.log(new Date().toLocaleTimeString('en-US') + " " +waitedTime +" ms (from service.js)")
waitedTime += syncWait(5)
console.log(new Date().toLocaleTimeString('en-US') + " after 2nd wait (from service.js)")
console.log(new Date().toLocaleTimeString('en-US') + " " +waitedTime+ " ms (from service.js)")

console.log(new Date().toLocaleTimeString('en-US') + " " +waitedTime +" ms (from service.js)")

//comment this while testing
parentPort.postMessage({ hello: workerData, waitedTime })

当我单独运行 service.js 时的结果:

5:26:06 AM before wait (from service.js)
5:26:09 AM after 1st wait (from service.js)
5:26:09 AM 3000 ms (from service.js)
5:26:14 AM after 2nd wait (from service.js)
5:26:14 AM 8000 ms (from service.js)
5:26:14 AM 8000 ms (from service.js)

我运行 main.js 时的结果:

5:26:39 AM Before worker thread (from main.js)
5:26:39 AM After worker thread (from main.js)
5:26:39 AM before wait (from service.js)
5:26:47 AM Final time (from main.js): 8000ms  //These appeared on 5:26:47 together
5:26:42 AM after 1st wait (from service.js)   //These appeared on 5:26:47 together unlike the timestamp
5:26:42 AM 3000 ms (from service.js)          //These appeared on 5:26:47 together unlike the timestamp
5:26:47 AM after 2nd wait (from service.js)   //These appeared on 5:26:47 together 
5:26:47 AM 8000 ms (from service.js)          //These appeared on 5:26:47 together 
5:26:47 AM 8000 ms (from service.js)          //These appeared on 5:26:47 together 

为什么该日志中的第 5 行和第 6 行等待完整的 8 秒才出现,而它们本应在 3 秒后出现?

4

0 回答 0