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

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

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

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

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

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

我的问题有两个 -

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

2) 有什么办法可以克服这种情况?

1) Am i correct in my analysis?

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

如果您的代码是 "crashing" 浏览器,则意味着主线程正在非常努力地工作,使浏览器没有线程时间来更新 UI 等

我说"not really"是因为听起来好像是主线程跟不上了,这和你想的很相似(但不一样)

2) Is there any way to overcome this situation?

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

如果您正在进行大量计算等,您只想使用主线程 来更新 UI,并将其他所有内容保留在工作线程中或两个(最多)。