如果工作线程发布消息时主线程繁忙,会发生什么情况
What will happen if the main thread is busy when a worker thread posts a message?
我遇到工作线程解析一些数据并使用postMessage
将解析的结果发送到主线程的情况。然后工作线程继续分析更多数据。因此,我们可以说,工作线程就像一个循环,在每个循环之后,它会将一些数据发送到主线程。
在主线程中,我在全局数组中进行一些查找以检查接收到的数据是否已存在。如果没有,那么我将数据插入数组中。当我这样做时,工作线程继续解析数据并将其发送到主线程。
查找可能非常昂贵且耗时。
现在我的问题是,它在每个浏览器中都会崩溃。但是,如果我从主线程中删除查找并将数据插入全局数组,它就可以正常工作。所以我假设崩溃正在发生,因为当从worker调用第二个postMessage
时,主线程保持忙碌。
我的问题是双重的——
1)我的分析是否正确?我的意思是,如果从工作线程调用postMessage
时主线程繁忙,是否有可能崩溃?
2)有没有办法克服这种情况?
1)我的分析是否正确?
不是真的,不是。JavaScript 通过作业队列工作(HTML5 称之为任务队列)。如果工作人员将消息发布到主 UI 线程,则发生的所有情况都是将对消息处理程序的调用添加到队列中。如果主线程忙于上一个作业,它将完成该作业,然后检查队列中是否有另一个作业。
如果你的代码"崩溃"了浏览器,这意味着主线程工作非常努力,浏览器缺乏线程时间来更新UI,等等。
我说"不是真的",因为听起来正在发生的事情是主线程跟不上,这与你认为正在发生的事情相似(但不相同)。
2)有没有办法克服这种情况?
从根本上说,将更多的工作转移到工作线程(或其他工作线程)上,远离主线程。但是没有代码,我们无法真正帮助您。
如果您正在进行密集的计算等,则只想将主线程用于更新 UI,并将其他所有内容保留在一两个工作线程中(最多)。
- 在javaservlet doPost方法中启动线程时,无法返回异常消息
- javascript中的多线程
- 在什么情况下需要同时使用compile&链接函数的角度
- Javascript支持多线程吗
- 如何在nodejs中创建线程池
- 起始节点.js用于并行的线程池
- Doppio:多线程是如何工作的,有什么限制吗
- 为什么Javascript SetTimeout()不是多线程的
- Selenium异步脚本在自己的线程中阻塞其他脚本
- Node.js如何使用更少的线程来处理多个连接
- 在什么情况下,Array.observe的“add”事件会触发
- 节点JS单线程与多线程(CPU利用率:有什么区别吗?
- 这个 Web worker 代码是多线程的吗,我是否获得了什么
- 如果工作线程发布消息时主线程繁忙,会发生什么情况
- 蜘蛛猴是线程安全的是什么意思
- AngularJS$q中的两个嵌套线程是否可以在没有$q.dedefe()的情况下分叉和连接
- 当标签关闭时,HTML5 web工作线程会发生什么's正在跑步
- JavaScript:线程安全与异步事件回调?(我需要'挥发物'还是什么?)
- 如果所有节点.js的工作线程都繁忙,会发生什么情况
- 在不使用多线程 Java 的情况下停止以前的搜索