为什么相同的同步代码在工作线程中运行时会得到不同的结果?当我从工作线程文件调用时,日志会延迟。
主文件:
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 秒后出现?