当工作线程发布消息时,如果主线程很忙会发生什么?

Ras*_*rov 2 javascript multithreading web-worker

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

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

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

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

我的问题有两个方面-

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

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

T.J*_*der 5

1)我的分析正确吗?

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

如果您的代码使浏览器“崩溃”,则意味着主线程非常努力地工作,浏览器没有足够的线程时间来更新 UI 等。

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

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

从根本上说,将更多的工作转移到工人(或另一个工人)并远离主线程。但是如果没有代码,我们就无法真正帮助您。

如果你正在做紧张的计算,这样,你要使用的主线程用于更新UI,并保留一切在辅助线程或两个(最多)。