簡體   English   中英

如果工作線程發布消息時主線程忙,該怎么辦?

[英]What will happen if the main thread is busy when a worker thread posts a message?

我遇到一種情況,工作線程解析一些數據,然后使用postMessage將解析結果發送到主線程。 然后工作線程繼續解析更多數據。 所以我們可以說,工作線程就像一個循環,在每個循環之后,它都會向主線程發送一些數據。

在主線程中,我在全局數組中進行了一些檢查,以檢查接收到的數據是否已經存在。 如果沒有,那么我將數據插入數組。 在執行此操作時,工作線程繼續解析數據並將其發送到主線程。

查找可能非常昂貴且耗時。

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

我的問題有兩個方面-

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

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

1)我的分析正確嗎?

不是,不是 JavaScript通過作業隊列 (HTML5稱為任務隊列 )工作。 如果您的工作人員在主UI線程中發布一條消息,則發生的一切就是將對消息處理程序的調用添加到隊列中。 如果主線程忙於上一個作業,它將完成該作業,然后檢查隊列中是否有其他作業。

如果您的代碼“崩潰”了瀏覽器,則意味着主線程正在非常努力地工作,使瀏覽器的線程時間不足以更新UI等。

我說“不是真的”是因為聽起來正在發生的事情是主線程無法跟上,這與您認為正在發生的事情類似(但不相同)。

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

從根本上講,將更多的工作轉移到該工人(或另一個工人)上,並遠離主線程。 但是如果沒有代碼,我們將無法真正為您提供幫助。

如果你正在做緊張的計算,這樣,你要使用的主線程用於更新UI,並保留一切在輔助線程或兩個(最多)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM