[英]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.