如果工作线程发布消息时主线程繁忙,会发生什么情况

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

本文关键字:线程 什么情况 布消息 工作 如果 消息      更新时间:2023-09-26

我遇到工作线程解析一些数据并使用postMessage将解析的结果发送到主线程的情况。然后工作线程继续分析更多数据。因此,我们可以说,工作线程就像一个循环,在每个循环之后,它会将一些数据发送到主线程。

在主线程中,我在全局数组中进行一些查找以检查接收到的数据是否已存在。如果没有,那么我将数据插入数组中。当我这样做时,工作线程继续解析数据并将其发送到主线程。

查找可能非常昂贵且耗时。

现在我的问题是,它在每个浏览器中都会崩溃。但是,如果我从主线程中删除查找并将数据插入全局数组,它就可以正常工作。所以我假设崩溃正在发生,因为当从worker调用第二个postMessage时,主线程保持忙碌。

我的问题是双重的——

1)我的分析是否正确?我的意思是,如果从工作线程调用postMessage时主线程繁忙,是否有可能崩溃?

2)有没有办法克服这种情况?

1)我的分析是否正确?

不是真的,不是。JavaScript 通过作业队列工作(HTML5 称之为任务队列)。如果工作人员将消息发布到主 UI 线程,则发生的所有情况都是将对消息处理程序的调用添加到队列中。如果主线程忙于上一个作业,它将完成该作业,然后检查队列中是否有另一个作业。

如果你的代码"崩溃"了浏览器,这意味着主线程工作非常努力,浏览器缺乏线程时间来更新UI,等等。

我说"不是真的",因为听起来正在发生的事情是主线程跟不上,这与你认为正在发生的事情相似(但不相同)。

2)有没有办法克服这种情况?

从根本上说,将更多的工作转移到工作线程(或其他工作线程)上,远离主线程。但是没有代码,我们无法真正帮助您。

如果您正在进行密集的计算等,则只想将主线程用于更新 UI,并将其他所有内容保留在一两个工作线程中(最多)。