【问题标题】:Web Workers vs Promises网络工作者与承诺
【发布时间】:2014-01-22 15:34:59
【问题描述】:

为了使 Web 应用具有响应性,您可以使用异步非阻塞请求。我可以设想两种方法来实现这一点。一种是使用延迟/承诺。另一个是网络工作者。使用 Web Workers,我们最终会引入另一个进程,并且我们会产生必须来回编组数据的开销。我一直在寻找某种性能指标来帮助了解何时选择简单的非阻塞回调而不是 Web Worker。

是否有某种方法可以制定使用哪种方法而不必对两种方法都进行原型设计?我在网上看到很多关于 Web Workers 的教程,但我没有看到很多成功/失败的故事。我只知道我想要一个响应式应用程序。我正在考虑使用 Web Worker 作为内存数据结构的接口,该结构可能是 0.5-15MB(本质上是一个 DB),用户可以查询和更新。

据我了解 javascript 处理,可以将单个长时间运行的任务拆分,以便定期产生控制权,从而允许其他任务获得处理时间片。这是使用 Web Workers 的标志吗?

【问题讨论】:

标签: javascript asynchronous promise jquery-deferred web-worker


【解决方案1】:

`Deferred/Promises 和 Web Workers 满足不同的需求:

  • Deferred/promise 是一种构造,用于分配对尚不可用结果的引用,并组织在结果可用或返回失败时运行的代码。

  • Web Worker 异步执行实际工作(使用操作系统线程而不是进程 - 因此它们的重量相对较轻)。

换句话说,JavaScript 是单线程的,你不能使用 deferred/promises 来异步运行代码——一旦代码运行实现了承诺,其他代码就不会运行(你可以改变顺序执行,例如使用setTimeout(),但这不会使您的网络应用程序本身更具响应性)。不过,您可能会以某种方式通过例如创建异步查询的错觉。通过每隔几毫秒递增索引来迭代一个值数组(例如使用 setInterval),但这几乎不实用。

为了以异步方式执行查询等工作,从而从应用程序的 UI 中卸载这项工作,您需要实际异步工作的东西。我看到了几个选项:

  • 使用提供异步 API 的 IndexedDB

  • 运行您自己的内存数据结构,并按照您的指示使用 Web Worker 来执行实际查询,

  • 使用服务器端脚本引擎,例如 NodeJS 来运行您的代码,然后使用客户端 ajax 启动查询(以及处理结果的承诺),

  • 使用可通过 HTTP 访问的数据库(例如 Redis、CouchDB),并从客户端发出异步 GET(即 ajax)来查询数据库(以及处理结果的承诺),

  • 使用例如开发混合网络应用程序。 Parse

哪种方法最适合您的情况?没有确切的要求很难说,但这里是我会看的尺寸:

  • 代码复杂性 — 如果您已经为数据结构编写了代码,那么 Web Workers 可能是一个不错的选择,否则 IndexedDB 看起来更明智。
  • 性能 — 如果您需要一致的性能,服务器端实现或 DB 似乎更合适
  • 架构/复杂性 — 您是希望所有处理都在客户端完成,还是您能负担得起管理服务器端实现的努力(成本)?

我发现this book 很有用。

【讨论】:

  • 您介意提供一个更具体的 Promise/WebWrokers 使用示例场景吗?我们可以与 UI 相关联的东西。谢谢!
  • 您忘记了费用。您能否负担得起在具有排队/功能架构的单独服务器上运行/重新运行繁重的报告。一个棘手的问题是存在低功耗设备,例如只有 2GB 内存的 10.5 英寸 iPad Pro。太糟糕了,他们先发制人地杀死大画布比什么都快。
  • 感谢您指出。为了清楚起见,你能负担得起管理服务器端实现的努力暗示了它的成本方面
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 2013-10-10
  • 2013-05-18
相关资源
最近更新 更多