使CPU绑定javascript感觉响应--- webworkers?

时间:2012-06-07 21:16:07

标签: javascript cpu-usage web-worker

我正在编写一个CPU密集型的javascript应用程序。我遇到了一个问题,有时UI被锁定,而CPU密集型计算发生时。我知道解决这个问题的标准方法是调用setTimeout并让事件循环响应UI事件。但是,这对我不起作用,这就是原因。

当页面加载时,javascript vm需要进行一堆解析和分析数据块。这是真正的背景内容,我正在调用setTimeout来运行每个块。但是,这意味着用户获得非常不稳定的UI体验,直到所有块完成(对于大文件可能长达10秒)和每次保存。这是不可接受的。

我可以想到两种解决方案,我都不喜欢这两种解决方案:

  1. 对块进行更细化,从而为事件循环提供更多机会。但是,我不喜欢这个,因为cpu代码已经相当复杂,但它通常运行良好。在整个cpu绑定代码中调用setTimeout将使其更加复杂
  2. 在服务器上做更多工作。但是,我正在运行一个节点服务器,这只会将问题从客户端推送到服务器,增加了带宽问题。
  3. 修复此问题对于传统的基于线程的VM来说是微不足道的。我该怎么做Javascript?


    更新:

    我忘了提到的一些观点:

    • 我们不关心传统浏览器,所有用户都需要使用现代的Firefox,Chrome,Opera,Safari,IE等。
    • 我们的初始原型将客户端和服务器放在一起,但是没有什么可以阻止我们移动到远程服务器。
    • 数据存在于客户端上(好吧......显然,如果客户端和服务器是同一台机器,但即使我们移动到远程服务器也是如此)。

    Webworkers可能是解决方案,但它们看起来仍然很脆弱。有人有经验吗?他们稳定吗?哪些现代浏览器不支持它们?他们有任何一般性问题吗?

1 个答案:

答案 0 :(得分:4)

根据此应用程序是否会公开,您必须决定是否可以使用Web Workers,更多地分割数据或进行服务器端处理。对于真实世界的应用程序,真正的解决方案是在服务器上进行繁重的计算,因为你不能指望用户拥有最新的处理器,它可能只是上网本,可能只会咳嗽几次然后崩溃。

当您可以确定用户拥有支持它的最新浏览器时,Web工作人员将是一个解决方案,但如果不是这样,则无法像大多数HTML5那样对其进行填充。

根据我对您的应用程序的了解,我会说您应该将预先计算的数据发送到客户端。此外,Node.js不善于进行核心计算,因此您可能希望查看服务器上的不同数据处理选项。此外,我认为带宽不会成为问题,因为无论如何你必须给客户端提供初始数据。处理后的数据有多大?