3

假設我們有一位網絡工作者引用名爲「worker.js」的文件。我們使用worker來執行「worker.js」中執行一些冗長操作的功能。我們向工作人員發送相應的消息並在主線程中繼續。但是,在工作人員完成其初始工作之前,主線程會向其發送另一條消息。在網絡工作人員仍在運行時向其發佈消息

我的問題:工作人員是否會繼續使用我們的計時功能,並且只處理新發布的消息,或者是否會中斷當前的操作直到新的消息完成?

+0

掛鉤https://stackoverflow.com/q/3177774/632951 – Pacerier

回答

2

我已經嘗試了在谷歌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 

餘弦變化能夠重新計算每個新的迭代以提供問題中描述的「時間佔用」算法。 顯然,只有在最後一個操作完成時才收到消息,因爲我觀察到在第10000個「hello world」輸出後立即打印了「xyz」輸出。

0

Web Worker由單個線程支持。這意味着當「onmessage」處理程序正在執行時,它將不能再接收另一個「onmessage」事件,直到前一個事件完成。

如果我們想要實現一些我們希望能夠暫停和恢復的背景計算過程,這是非常不方便的,因爲沒有辦法向正在運行的工作人員發送「暫停」消息。我們可以通過worker.terminate()來阻止網絡工作者,但是這完全殺死了工作者。

我能想到的唯一方法是通過切片工人執行成塊,然後從在每個組塊,然後觸發消息工人的端發佈消息工人以處理下一個數據塊, 等等。

相關問題