gpt4 book ai didi

javascript - 两个 javascript 网络 worker 连续打印输出 - 为什么不同时打印?

转载 作者:行者123 更新时间:2023-11-29 21:30:51 24 4
gpt4 key购买 nike

我正在研究 JavaScript 中的网络 worker 和多线程/并发。我试图通过运行以下程序向自己“证明”它

HTML

<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>Worker 2</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
<script src="main.js"></script>
</head>
<body>
</body>
</html>

ma​​in.js

var myFunction = function() {

worker = new Worker('worker.js');

worker.postMessage('cowboy');

for (var i=0; i<500; i++) {
var d = new Date();
var h = d.getHours();
var m = d.getMinutes();
var s = d.getSeconds();
var ms = d.getMilliseconds();
console.log("main: " + h + ":" + m + ":" + s + ":" + ms);
}

};
window.onload=myFunction;

worker.js

self.addEventListener('message', receiveMessage);

function receiveMessage(e) {
for (var i=0; i<500; i++) {
var d = new Date();
var h = d.getHours(); // => 9
var m = d.getMinutes(); // => 30
var s = d.getSeconds(); // => 51
var ms = d.getMilliseconds();
console.log("worker: " + h + " " + m + ":" + s + ":" + ms);
}
}

会发生的是,首先打印来自 main.js 的所有 console.log 语句,然后是来自 worker.js 的所有 console.log 语句,例如

Console.log screenshop

我本以为打印输出会穿插,例如

main: 21:50:10:707
worker: 21 50:10:708
main: 21:50:10:709
main: 21:50:10:710
worker: 21 50:10:711
worker: 21 50:10:712
worker: 21 50:10:713
main: 21 50:10:714

为什么这没有发生,有没有办法像上面那样证明这一点?

最佳答案

我不是专家,但这是我的有根据的猜测:

postMessage 是异步的。当您调用它时,它会将要发送的消息排队,并且会在当前“线程”(即“记录 500 条控制台消息”位)完成时实际发送。届时它可以自由地将消息发送给工作人员,工作人员将能够记录自己的消息。

要对此进行测试,请尝试将 setTimeout(function() { ... }, 1); 包裹在循环中...理论上,您现在应该首先看到 worker 的消息,然后是 main线程的。

关于javascript - 两个 javascript 网络 worker 连续打印输出 - 为什么不同时打印?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36535520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com