gpt4 book ai didi

javascript - 网络 worker - 他们是如何工作的?

转载 作者:太空狗 更新时间:2023-10-29 15:52:42 25 4
gpt4 key购买 nike

我正在努力理解 this example :

HTML(主要代码):

   <html>  
<title>Test threads fibonacci</title>
<body>

<div id="result"></div>

<script language="javascript">

var worker = new Worker("fibonacci.js");

worker.onmessage = function(event) {
document.getElementById("result").textContent = event.data;
dump("Got: " + event.data + "\n");
};

worker.onerror = function(error) {
dump("Worker error: " + error.message + "\n");
throw error;
};

worker.postMessage("5");

</script>
</body>
</html>

Javascript(工作代码):

   var results = [];  

function resultReceiver(event) {
results.push(parseInt(event.data));
if (results.length == 2) {
postMessage(results[0] + results[1]);
}
}

function errorReceiver(event) {
throw event.data;
}

onmessage = function(event) {
var n = parseInt(event.data);

if (n == 0 || n == 1) {
postMessage(n);
return;
}

for (var i = 1; i <= 2; i++) {
var worker = new Worker("fibonacci.js");
worker.onmessage = resultReceiver;
worker.onerror = errorReceiver;
worker.postMessage(n - i);
}
};

我有以下问题:

  • worker 代码什么时候开始运行? var worker = new Worker("fibonacci.js"); 执行后立即 ?

  • worker 代码中的 onmessage = function(event) { ... } 赋值是否会在 worker.postMessage("5"); 在主代码中 ?

  • worker 代码可以访问在主代码(如 worker)中定义的全局变量吗?

  • 主代码能否访问工作代码中定义的全局变量(如 results)?

  • 在我看来,主代码中的 worker.onmessage = function(event) {...}onmessage = function(event) { ...} 在 worker 代码中(这是 worker 的 onmessage 事件处理程序)。我哪里错了?它们有什么区别?

  • 这段代码实际上应该做什么?当我运行它时 here它只打印“5”。这是它应该做的,还是我遗漏了什么?

非常感谢!

最佳答案

查看 HTML5 Rocks: The Basics of Web Workers用于一般教程。

  • 只要您调用worker的postMessage方法,Workers就会启动。
  • 主代码中worker的onmessage绑定(bind)的函数会在worker调用postMessage时起作用。
  • 全局变量不在主线程和工作线程之间共享。传递数据的唯一方法是通过 postMessage 进行消息传递。
  • 如您所料,worker 和 main 代码上的 onmessage 具有相同的含义。它是线程收到消息事件时的事件处理程序。您甚至可以使用 addEventListener 来捕获 message 事件:

主要代码:

function showResult(event) {  
document.getElementById("result").textContent = event.data;
dump("Got: " + event.data + "\n");
}
var worker = new Worker("fibonacci.js");
worker.addEventListener('message', showResult, false);

worker 代码:

addEventListener('message', resultReceiver, false);

您采用的斐波那契示例是一个递归 worker 示例。如果不使用 worker ,它会是这样的:

function fibonacci(n) {
if (n == 0 || n == 1) return n;
return fibonacci(n-1) + fibonacci(n-2);
}

var result = fibonacci(5);
dump("Got: " + result + "\n");

(哦不,我不会为你做一个stackless。你自己写!)

关于javascript - 网络 worker - 他们是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2896480/

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