我知道將對象傳輸到Web Worker會導致主線程失去所有權。我想知道是否有辦法重新獲得所有權。這Plunker(代碼如下)演示我遇到的問題。是否有可能將傳輸的ArrayBuffer返回原始類型的數組?
main.js
var worker = new Worker("worker.js");
var z = new Int16Array(10);
worker.onmessage = function(e) {
console.log(e.data); // [0, 1, ... 10]
console.log(z); // [], ownership not regained here
}
console.log(z); // [0, 0, ... 0], original value here
worker.postMessage(z, [z.buffer]);
console.log(z); // [], ownership lost here
worker.js
self.onmessage = function(e) {
var data = e.data; // transferred "z" from main.js
for (var i = 0; i < 10; i++) {
data[i] = i;
}
// I thought this would return ownership back to the main thread
self.postMessage(data, [data.buffer]);
}
本質上說,最終目標是從輔助線程內的主線程改變z
值,而不必在收到消息後在主線程中複製結果。但是,工人似乎保留z
的所有權。我誤解了什麼嗎?有沒有辦法做到這一點?
任何建議,非常感謝。
我不確定,你可以在主js的onmessage'處理函數中執行'z = e.data'嗎? – Passerby
實際上我正在使用WebGL緩衝區。不幸的是,設置這個變量對WebGL來說還不夠。我必須去重新綁定緩衝區。我可以讓它工作,但它並不理想。 –
我想這更像是一個概念性問題。我可以想象,轉讓所有權可以爲單個實體提供兩種工作方式,但我無法弄清楚一旦所有權歸還給工人後如何歸還所有權。 –