2010-07-09 47 views
5

請考慮下面的代碼,並從該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中設置超時來實現!目前我看不到,如何使用網絡工作者而不會遇到競賽狀況?

回答

3

答案是,無論是主腳本和網絡工作者有MessagePort隊列其中初始工人腳本返回之前收集的信息。

有關詳細信息,請參閱WHATWG幫助郵件列表上的主題: http://lists.whatwg.org/pipermail/help-whatwg.org/2010-August/000606.html

+0

到郵件列表的鏈接現在已損壞。任何想法在哪裏讀取線程,或者,有沒有任何陷阱? – HRJ 2015-12-22 05:59:33

+0

@HRJ對不起,我找不到該線程的存檔版本。但是沒有陷阱,消息隊列確保你不必擔心競爭狀況。 – tsauerwein 2015-12-22 14:42:06

2

是的,在這裏可能導致競爭條件。責任在於Worker的開發者。在通過postMessage()接收到消息後,它應該開始只發布消息只有。在構造函數中,它只能進行初始化,而不是實際的處理。在你的頁面的示例部分,有關於fibonachi數字的很好的示例。看看它的結構,真正的工作從收到消息開始。遵循該模式。

+2

如果主線程發送它的啓動消息,在網絡工作者樹立了的onMessage處理程序之前是什麼?那可能嗎? – tsauerwein 2010-07-09 19:01:36