让 CPU 绑定的 javascript 感觉响应——网络工作者?

And*_*erg 2 javascript cpu-usage web-worker

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

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

我能想到 2 个解决方案,但我都不喜欢:

  1. 对块进行更细化,从而为事件循环运行提供更多机会。但是,我不喜欢这样,因为 cpu 代码已经很复杂,但它通常运行良好。调用setTimeout整个 cpu 绑定代码会使它变得更加复杂
  2. 在服务器上做更多的工作。但是,我正在运行一个节点服务器,这只会将问题从客户端推送到服务器,并增加带宽增加的问题。

在传统的基于线程的 VM 上解决这个问题是微不足道的。我应该为 Javascript 做什么?


更新:

我忘记提及的一些要点:

  • 我们不关心旧版浏览器,所有用户都需要使用现代 Firefox、Chrome、Opera、Safari、IE 等。
  • 我们最初的原型有客户端和服务器位于同一位置,但应该没有什么阻止我们移动到远程服务器。
  • 数据存在于客户端(嗯……显然,如果客户端和服务器是同一台机器,但即使我们移动到远程服务器也是如此)。

Webworkers 可能是解决方案,但它们看起来仍然不稳定。有没有人有他们的经验?他们稳定吗?哪些现代浏览器不能很好地支持它们?他们有什么普遍的问题吗?

zat*_*ata 5

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

当您可以确定用户拥有支持它的最新浏览器时,Web Workers 将是一个解决方案,但如果不是这种情况,则无法像大多数 HTML5 内容一样填充它。

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