我遇到一种情况,即工作线程解析一些数据并使用postMessage
将解析后的结果发送到主线程。然后工作线程继续解析更多数据。所以我们可以说,工作线程就像一个循环,在每个循环之后,它会向主线程发送一些数据。
在主线程中,我会在全局数组中查找以检查接收的数据是否已存在。如果没有,那么我将数据插入数组中。当我这样做时,工作线程继续解析数据并将其发送到主线程。
查找可能非常昂贵且耗时。
现在我的问题是,它在每个浏览器中都崩溃了。但是,如果我从主线程中删除查找并将数据插入全局数组,它可以正常工作。所以我假设崩溃正在发生,因为当从工作人员调用第二个postMessage
时主线程保持忙碌。
我的问题有两个 -
1)我的分析是否正确?我的意思是,如果从工作线程调用postMessage
时主线程正忙,是否可能崩溃?
2)有没有办法克服这种情况?
答案 0 :(得分:4)
1)我的分析是否正确?
不是,不。 JavaScript通过作业队列(HTML5将其称为任务队列)工作。如果您的工作人员向您的主UI线程发布消息,那么所有发生的事情都是对消息处理程序的调用添加到队列中。如果主线程忙于上一个作业,它将完成该作业,然后检查队列中的另一个作业。
如果您的代码“崩溃”了浏览器,则意味着主线程工作非常困难,使浏览器的线程时间不足以更新UI等。
我说“不是真的”,因为它听起来像正在发生的是主线程无法跟上,这与您认为发生的事情类似(但不完全相同)。
2)有没有办法克服这种情况?
从根本上说,将更多的工作转移到工人(或其他工人)并远离主线程。但是没有代码,我们就无法真正帮助你。
如果您正在进行激烈的计算等,您希望仅使用主线程 来更新UI,并将其他所有内容保留在一个或两个工作线程中(最多)。