2016-01-24 82 views
2

我有一种情况,工作线程解析一些数据并使用postMessage将解析结果发送到主线程。然后工作线程继续解析更多数据。所以我们可以说,工作线程就像一个循环,在每个循环之后,它会向主线程发送一些数据。工作线程发布消息时,如果主线程忙,会发生什么情况?

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

查找可能相当昂贵和耗时。

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

我的问题是两倍 -

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

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

回答

4

1)我的分析是否正确?

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

如果你的代码是“崩溃”的浏览器,这意味着主线程的工作很辛苦,饥饿的线程时浏览器更新UI等

我说:“不是真的”,因为它听起来就像发生的事情一样,主线程跟不上,这与你想象中的情况类似(但不一样)。

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

基本上,将更多的工作转移给工人(或另一个工人)并远离主线程。但没有代码,我们无法真正帮助你。

如果你正在进行激烈的计算等,你想使用主线程只有更新用户界面,并保持一切工作线程或两个(最多)。

+0

我实际上使用THREE.js,其中顶点数据来自服务器。很多顶点数据立即来自服务器。在我的工作线程中,我解析数据,当某些顶点产生“面”时,我将该面插入到我的主线程中的全局数组中。 我会尝试在另一个工作线程中查看是否可以解决问题。 –

相关问题