請考慮下面的代碼,並從該Mozilla教程"Using web workers"的解釋:在這個例子中創建和運行工作線程 開始設置onmessage處理程序時與網絡工作者的競爭條件?
var myWorker = new Worker('my_worker.js');
myWorker.onmessage = function(event) {
print("Called back by the worker!\n");
};
1號線。 第2行將worker的 的onmessage處理函數設置爲當工作人員調用其自己的 postMessage()函數時調用的函數 。
該線程在調用Worker構造函數時開始。我想知道在處理器上設置處理器時是否會出現競態條件。例如,如果網絡工作者在之前發佈消息,則設置消息。
有人對此有更多瞭解嗎?
更新:
安德烈指出,網絡工作者應該開始工作,當它收到一個消息,如在Mozilla的教程中的斐波那契數的例子。但是,這不會在web worker中設置onmessage處理程序時創建新的競爭條件嗎?
例如:
主要腳本:
var myWorker = new Worker('worker.js');
myWorker.onmessage = function(evt) {..};
myWorker.postMessage('start');
的網絡工作者腳本( 'worker.js')
var result = [];
onmessage = function(evt) {..};
,然後再考慮下面的執行路徑:
main thread web worker
var worker = new Worker("worker.js");
var result = [];
myWorker.onmessage = ..
myWorker.postMessage('start');
onmessage = ..
Th e「var result = []」行可以省略,它仍然是相同的效果。
這是一個有效的執行路徑,我試着通過在web worker中設置超時來實現!目前我看不到,如何使用網絡工作者而不會遇到競賽狀況?
到郵件列表的鏈接現在已損壞。任何想法在哪裏讀取線程,或者,有沒有任何陷阱? – HRJ 2015-12-22 05:59:33
@HRJ對不起,我找不到該線程的存檔版本。但是沒有陷阱,消息隊列確保你不必擔心競爭狀況。 – tsauerwein 2015-12-22 14:42:06