我正在努力理解 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/