webworker本身是多线程的吗?

时间:2012-03-08 06:56:22

标签: javascript html5

e.g。


 worker.postMessage(data1);
 worker.postMessage(data2);

在webwoker中,假设有大量问题需要处理,worker.postMessage(data2)会在完成data1之前阻止

1 个答案:

答案 0 :(得分:6)

单个工作人员在队列中执行其任务,即一次执行一项任务。请尝试以下示例:

<!DOCTYPE html>

<script>

var worker = new Worker('worker.js');
worker.postMessage({ task: 1, iterations: 100 }); // very slow task
worker.postMessage({ task: 2, iterations: 1 }); // very quick task
worker.onmessage = function(event) {
    console.log(event.data);
};

</script>

worker.js:

self.onmessage = function(event) {
    for (var i = 0; i < event.data.iterations * 1000 * 1000 * 10; i++) {};
    self.postMessage("Finished task " + event.data.task);
}

输出继电器:

Finished task 1
Finished task 2

任务总是按顺序完成,即首先是慢速任务,然后是快速任务。 (如果任务是并行执行的,则第二个任务将首先以明显的边距完成。)

(只是要明确:调用postMessage总是在其执行上下文中阻塞(作为任何函数调用)但有效地“立即”返回,因为发布消息本身是非常快速的操作。这可能不是你问的。)

注意:如果您尝试从本地磁盘加载worker.js,则Chrome会引发安全性异常,适用于Safari&amp; Firefox浏览器。