2011-12-01 37 views
9

我正在試驗網絡工作者,並想知道他們會如何處理不平行的問題。因此我實施了Connaway's Game of Life。 (要有一點比做模糊更有趣,但是在這種情況下問題會是一樣的)如何進行工人與工人的溝通?

目前我有一個Web工作人員執行迭代併發布新的ImageData for UI線程放在我的畫布上。很好地工作。

但是,我的實驗並沒有結束,因爲我有幾個CPU可用,並且想並行化我的應用程序。

所以,首先簡單地說,我將數據分成兩部分,中間是兩部分,每部分分別處理一半。問題當然是分裂。工作者A需要來自工人B的一列像素,反之亦然。現在,我可以明確地解決這個問題,讓我的UI線程將這個列給工人,但是如果我的線程可以直接將它們傳遞給eachother,那會更好。

當進一步分裂時,每個工作人員只需要跟蹤它的鄰居工作人員,UI線程只負責更新UI(它應該是)。

我的問題是,我沒有看到我如何實現這種工人對工作者的溝通。我嘗試通過初始化postMessage將鄰居交給海誓山盟,但那會複製我的工作者而不是傳遞引用,幸運的是,chrome警告我不可能。

Uncaught Error: DATA_CLONE_ERR: DOM Exception 25 

最後我看到有一種叫做SharedWorker的東西。這是我應該看看,還是有辦法使用Worker可以解決我的問題?

回答

5

您應該能夠使用channel messaging

var channel = new MessageChannel(); 
worker1.postMessage({code:"port"}, [channel.port1]); 
worker2.postMessage({code:"port"}, [channel.port2]); 

然後在您的工作線程:

var xWorkerPort; 
onmessage = function(event) { 
    if (event.data.code == "port") { 
     xWorkerPort = event.ports[0]; 
     xWorkerPort.onmessage = function(event) { /* do stuff */ }; 
    } 
} 

沒有太多的文檔身邊,但你可以嘗試this MS summary上手。

+0

感謝您的回答@robertc,我完全忘記了這一點。我想我應該在這上面花點時間。 – Mithon

+0

消息通道如何對工作人員通信有用 –

+0

在Firefox出現此錯誤消息之前,這將無法使用:https://bugzilla.mozilla.org/show_bug.cgi?id = 911972 – Adria