【问题标题】:RxJS and WebWorkersRxJS 和 WebWorkers
【发布时间】:2016-01-31 10:44:04
【问题描述】:

快速提问

如果我有一个WebWorker,它有一个函数将Observable<Any>返回给UI代码,如果我订阅了Observable,那么observable是在UI线程还是WebWorker线程上运行?

我问这个问题是因为我正在使用 RxJS 编写一个 Angular2 应用程序,为了提高性能,我希望一些勤奋的 Observables 在 WebWorkers 中运行,将结果流传递给 UI 线程

【问题讨论】:

  • 您的帖子没有任何问题,也没有您尝试制作的代码示例。
  • @shershen 请再次阅读问题。它包含所有必要的信息(唯一缺少的是问号:)

标签: angularjs system.reactive web-worker rxjs


【解决方案1】:

我假设您的 web worker 正在通过消息将 observable 发送回您的主线程。

消息旨在以两种方式使用,您不能发送暴露功能的对象。

解决方案是让您的网络工作者发布消息,然后让一个主线程服务处理这些消息并将它们通过管道传送到一个主题中,它作为一个 IObservable 向您的应用程序公开。

请记住,Web Worker 消息传递不支持通道,因此如果您在应用的多个区域使用消息,则需要应用自己的鉴别器。

【讨论】:

  • 能否提供类似架构的代码示例?我想了解术语(主线程服务与应用程序)
  • 所以你说的唯一可以在 web worker 和主线程之间移动的对象是简单的数据对象。那是因为它们需要序列化吗?谢谢
  • @Dean 出于所有意图和目的,是的,只是数据对象。本质上,您的主线程中有一些代码订阅onmessage,并通过onNext() 将接收到的数据发送到Subject。需要显示此信息的应用部分将订阅该主题以接收更新。
  • 谢谢理查德,这太棒了
  • RxJS 也有一个fromWorker,它将 URL 传递给您的 Web Worker:github.com/Reactive-Extensions/RxJS-DOM/blob/master/doc/…
【解决方案2】:

简短的回答是,Rx 不会引入并发,除非你通过 SubscribeOn、ObserveOn 或像 Buffer 这样的转换运算符来指示它。

因此,Rx 运算符的“订阅”部分中的任何代码都将在您称为 .Subscribe(onNext 等) 的同一线程中运行。然而实际的回调 onNext、onError 和 onComplete 将在观察者使用的任何线程上运行,你无法控制它(除非你编写了操作符)。

为确保您在 UI 线程上收到调用,您应该添加一个 .ObserveOn(UIDispatcherThread)。这将保证您被回调的线程并使其可测试。

希望对您有所帮助。

【讨论】:

    【解决方案3】:

    正如其他人所指出的,调用代码和网络工作者之间的通信是序列化的,因此您不能通过网络发送具有行为(例如可观察到的)的东西。

    我写了一个小助手,它使用 Rxjs 来帮助解决这个问题以及与 webworkers 一起开发的其他问题。阅读它here,github repo here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      • 1970-01-01
      • 2013-08-14
      相关资源
      最近更新 更多