让 CPU 绑定的 JavaScript 感觉响应迅速---webworkers
Making CPU Bound javascript feel responsive---webworkers?
我正在编写一个CPU密集型JavaScript应用程序。 我遇到了一个问题,有时 UI 被锁定,而 CPU 密集型计算发生。 我知道解决此问题的标准方法是调用setTimeout
并让事件循环响应 UI 事件。 但是,这对我不起作用,这就是原因。
当页面加载时,javascript vm 需要对数据块进行大量解析和分析。 这是真正的背景内容,我正在调用setTimeout
来运行每个块。 但是,这意味着用户将获得非常不稳定的 UI 体验,直到所有块都完成(对于大文件最多可以长达 10 秒)和每次保存。 这是不可接受的。
我可以想到 2 个解决方案,这两个解决方案我都不太喜欢:
- 对区块更加精细,从而为事件循环运行提供更多机会。但是,我不喜欢这样,因为 cpu 代码已经相当复杂,但它通常运行良好。 在整个 CPU 绑定代码中调用
setTimeout
会使它变得更加复杂 - 在服务器上执行更多工作。 但是,我正在运行一个节点服务器,这只会将问题从客户端推送到服务器,并增加带宽的问题。
在传统的基于线程的 VM 上修复此问题是微不足道的。 我应该为Javascript做什么?
更新:
我忘了提的几点:
- 我们不关心旧版浏览器,所有用户都需要使用现代火狐,Chrome,Opera,Safari,IE等。 我们
- 最初的原型将客户端和服务器放在同一位置,但应该没有什么可以阻止我们移动到远程服务器。
- 数据存在于客户端上(嗯...显然,如果客户端和服务器是同一台机器,但即使我们移动到远程服务器也是如此)。
网络工作者可能是解决方案,但他们看起来仍然很脆弱。 有人有经验吗?它们稳定吗? 哪些现代浏览器不能很好地支持它们? 它们有什么普遍问题吗?
根据此应用程序是否会公开,您必须决定是否可以使用 Web Workers、拆分更多数据或进行服务器端处理。对于现实世界的应用程序,真正的解决方案是在服务器上进行大量计算,因为您不能期望用户拥有最新的处理器,它可能只是一个上网本,可能只会咳嗽几次然后崩溃。
当您可以确定用户拥有支持它的最新浏览器时,Web Workers将是一个解决方案,但是如果不是这种情况,则无法像大多数HTML5内容一样填充它。
根据我对应用程序的了解,我认为您应该将预先计算的数据发送到客户端。此外,Node.js 不擅长进行硬核计算,因此您可能需要查看服务器上的不同数据处理选项。另外,我认为带宽不会成为问题,因为无论如何您都必须向客户端提供初始数据。处理后的数据有多大?
- 如何将getJson的响应保存在全局变量中
- 如何使用Spring MVC将Facebook返回的响应数据保存在Java类中
- 使用angularjs向浏览器发送servlet响应(下载功能)
- MockJax没有在JavaScript应用程序中发送对我AJAX请求的响应
- 不再使用innerHTML进行AJAX响应.(代码未得到响应)
- 为什么可以't我使用了AJAX响应的一部分
- 响应动画手风琴不工作
- 如何从SeleniumWebdriver获取异步Javascript响应
- Ajax调用在Firefox中不会自动响应
- 可以在响应时隐藏iphone上的“播放”按钮以进行视频播放
- 由于响应中不存在“Access Control Allow Origin”标头,跨域请求停止工作
- 如何在 JavaScript 和 HTML 中更改对输入框的提示响应
- IIS动态HTTP响应标头
- 预期响应包含一个对象,但在angular js中得到一个数组错误
- Ajax响应转换
- 使Intro.js工具提示响应
- 存储$http如何从$http函数(Angularjs)外部获取可访问变量中的响应
- 将高图饼图中的文本居中显示为响应
- Css转换没有响应
- 让 CPU 绑定的 JavaScript 感觉响应迅速---webworkers