在Web工作程序仍在运行时向其发布消息

时间:2015-08-28 10:30:51

标签: javascript multithreading asynchronous interrupt web-worker

假设我们有一个Web工作者引用一个名为“worker.js”的文件。我们使用worker在“worker.js”中执行一个执行一些冗长操作的函数。我们将相应的消息发布给工作者并在主线程中继续。但是,在工作人员完成初始工作之前,主线程会向其发送另一条消息。

我的问题:工作人员是否会继续执行我们的计时功能,并且只会在完成后处理新发布的消息,还是会中断当前的操作直到新的消息完成?

2 个答案:

答案 0 :(得分:4)

我已经在Google Chrome的调试器中尝试了以下代码:

worker.js:

var cosine;
self.onmessage = function(e) {
    if (e.data.message == 0) {
        for (var i = 0; i < 10000000; i++) {
            cosine = Math.cos(Math.random());
            if (i % 1000 == 0) console.log("hello world");
        }
    } else if (e.data.message == 1) {
        console.log("xyz");
    }
};

main.js:

var worker;

function main() {
    worker = new Worker("js/worker.js");
    worker.postMessage({message: 0});
    setTimeout(xyz, 10);
}

function xyz() {
    worker.postMessage({message: 1});
}

输出:

(10000 times) test.js:11 hello world
test.js:14 xyz

每次重复迭代都会重新计算余弦变量,以提供&#34;时间拍摄&#34;问题中描述的算法。 显然,只有在最后一次操作完成后才会收到消息,因为我观察了&#34; xyz&#34;在10000th&#34; hello world&#34;之后立即打印输出。输出

答案 1 :(得分:1)

Web Worker由单个线程支持。这意味着当“onmessage”处理程序正在执行时,它将无法接收另一个“onmessage”事件,直到上一个事件完成。

如果我们想要实现一些我们希望能够暂停和恢复的后台计算过程,这是非常不方便的,因为无法向正在运行的工作人员发送“暂停”消息。我们可以通过worker.terminate()来阻止Web工作者,但这会完全杀死工作者。

我能想到的唯一方法是将工作程序执行切成块,然后在每个块的末尾发布来自的消息,然后触发消息处理下一个块的工人,依此类推。