【问题标题】:What will happen if the main thread is busy when a worker thread posts a message?工作线程发消息时,如果主线程忙,会发生什么?
【发布时间】:2016-01-24 12:54:40
【问题描述】:

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

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

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

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

我的问题有两个 -

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

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

【问题讨论】:

    标签: javascript multithreading web-worker


    【解决方案1】:

    1) 我的分析正确吗?

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

    如果你的代码让浏览器“崩溃”,这意味着主线程工作非常辛苦,让浏览器缺乏线程时间来更新 UI,等等。

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

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

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

    如果您正在进行密集计算等,您希望使用主线程来更新 UI,并将其他所有内容保存在一个或两个工作线程中(最多)。 p>

    【讨论】:

    • 我实际上在使用 THREE.js,其中顶点数据来自服务器。大量顶点数据一次来自服务器。在我的工作线程中,我解析数据,当一些顶点形成“面”时,我将该面插入到主线程的全局数组中。我将尝试在另一个工作线程中进行查找以检查是否可以解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 2013-10-13
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    相关资源
    最近更新 更多