2016-01-24 39 views
2

我有一種情況,工作線程解析一些數據並使用postMessage將解析結果發送到主線程。然後工作線程繼續解析更多數據。所以我們可以說,工作線程就像一個循環,在每個循環之後,它會向主線程發送一些數據。工作線程發佈消息時,如果主線程忙,會發生什麼情況?

在主線程中,我在全局數組中查找了一下,以檢查接收到的數據是否已經存在。如果沒有,那麼我將數據插入到數組中。雖然我這樣做,工作線程繼續解析數據並將其發送到主線程。

查找可能相當昂貴和耗時。

現在我的問題是,它在每個瀏覽器崩潰。但是,如果我從主線程刪除查找,並將數據插入全局數組,它可以正常工作。所以我假設崩潰正在發生,因爲當第二個postMessage被worker調用時,主線程保持忙碌狀態。

我的問題是兩倍 -

1)我的分析是否正確?我的意思是,當工作線程調用postMessage時,如果主線程忙,是否有可能崩潰?

2)有什麼辦法可以克服這種情況嗎?

回答

4

1)我的分析是否正確?

不是,沒有。 JavaScript通過作業隊列工作(HTML5稱其爲任務隊列)。如果您的工作人員向您的主UI線程發佈消息,則會發生所有情況,即將對消息處理程序的調用添加到隊列中。如果主線程忙於前一個作業,它將完成該作業,然後檢查隊列中的其他作業。

如果你的代碼是「崩潰」的瀏覽器,這意味着主線程的工作很辛苦,飢餓的線程時瀏覽器更新UI等

我說:「不是真的」,因爲它聽起來就像發生的事情一樣,主線程跟不上,這與你想象中的情況類似(但不一樣)。

2)有什麼辦法可以克服這種情況嗎?

基本上,將更多的工作轉移給工人(或另一個工人)並遠離主線程。但沒有代碼,我們無法真正幫助你。

如果你正在進行激烈的計算等,你想使用主線程只有更新用戶界面,並保持一切工作線程或兩個(最多)。

+0

我實際上使用THREE.js,其中頂點數據來自服務器。很多頂點數據立即來自服務器。在我的工作線程中,我解析數據,當某些頂點產生「面」時,我將該面插入到我的主線程中的全局數組中。 我會嘗試在另一個工作線程中查看是否可以解決問題。 –

相關問題