假設我有一個名為的 WebWorker 檔案ticker.js,其中包含以下內容:
function tick() {
postMessage(1);
}
setInterval(tick, 1);
然后在主 JavaScript 程式中我有這個:
let ready = true;
let prevTime = 0;
function sometimesLongTask() {
ready = false;
if (performance.now() - prevTime > 30) {
// a very long CPU intensive task, like a loop which takes a while to complete
prevTime = performance.now();
}
ready = true;
}
const intervalWorker = new Worker('ticker.js');
intervalWorker.onmessage = function() {
ready && sometimesLongTask();
};
這會導致記憶體泄漏嗎?
我認為不會,但我不確定。我的邏輯是 whilesometimesLongTask有時需要一段時間(當 30 毫秒過去時),99% 的時間它會立即執行。因此,即使tick每毫秒都會向 Javascript 的事件佇列添加一個新的,但每隔一段時間,Javascript 可以加速所有這些并將它們清除,因為它們中的大多數不需要執行。真的是這樣嗎?
另外,我在這里是否需要準備好標志,或者它什么都不做(我可以擺脫它)?我認為它可能什么都不做,因為 Javascript 是單執行緒的,所以即使 WebWorker 可能會很快發布多條訊息,Javascript 也不能??同時運行多個實體sometimesLongTask。正確的?
uj5u.com熱心網友回復:
是的,這不會導致記憶體泄漏,因為根據定義,這意味著記憶體分配不會被釋放,盡管不再需要。訊息佇列中的事件仍然是需要的,它們最終會被作業人員接收。
但是你甚至不會得到不斷增長的記憶體使用量。這完全是由于prevTime比較——我們可以假設所有排隊的事件都可以在長任務運行之間的 30 毫秒內被處理(不做任何事情)。
我什至需要
ready這里的標志,還是什么都不做?
它確實沒有任何用處。請注意,它始終是true在執行處理程式時onmessage。處理程式將永遠不會中斷您設定為的onmessage同步。sometimesLongTaskfalse
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/463389.html
標籤:javascript 表现 内存泄漏 网络工作者
