【问题标题】:Does putting a WebSocket on a WebWorker make sense?将 WebSocket 放在 WebWorker 上有意义吗?
【发布时间】:2015-09-05 15:24:36
【问题描述】:

我的网站使用网络套接字连接到实时数据流。数据流只是一系列 JSON 消息。在 websocket 处理程序中,当我收到一条消息时,我会解析 JSON 并将一些数据点添加到图表中。

我的问题是:将 websocket 移到它自己的工作线程上有意义吗?

起初我想我可以在它自己的线程上解析 JSON 并将反序列化的对象发送给 UI 线程,这可能会节省一些时间。不幸的是,看起来 postMessage 要求我发送字符串。因此,在自己的线程上解析 JSON 没有任何好处。

在自己的线程上接收网络套接字数据似乎也没有任何好处——我认为浏览器已经在自己的线程上接收数据并传递我的 javascript 回调在适当的时候。

因此,鉴于实时数据接收没有进行任何后期处理——它主要是直接到 UI——将 websocket 连接放在 web worker 上是否有意义?

谢谢! 安德鲁

【问题讨论】:

  • 恕我直言,只有在将一些压缩结果发送回主线程之前对 JSON 消息进行大量(CPU 繁重)处理时才有意义。
  • 这个问题太宽泛了,因为它确实发生在您对数据进行了多少处理。让工人增加更多的开销,但如果你正在做一些压缩或其他什么,最好在工人中做。

标签: javascript html multithreading websocket web-worker


【解决方案1】:

是的,当我需要避免敏感时期的浏览器线程中断时(当使用从我的自定义 nodejs 服务器提供的 Web Audio API 呈现流式音频时),我需要将 websocket 处理放入 web-worker 的实例。每次浏览器端的 websocket 接收到音频数据的消息时,它都会在渲染音频时中断浏览器处理并发出可听见的咔嗒声,如果您的应用程序没有这种延长的敏感时间段,这很好。通过将 websocket 管理放入 webworker 中,我避免了中断 Web Audio API 事件循环。 webworker 将处理它放入 webworker 端循环队列的 websocket 传入数据。浏览器端 Web 音频 API 事件循环将在其自己的事件循环停机时间内接入这个 webworker 管理的队列,从而避免对 Wed Audio API 事件循环的任何中断。

查看对应的repohttps://github.com/scottstensland/websockets-streaming-audio

我早在 2015 年就做过这项工作,但从外观上看,Web Audio API 最近获得了新工具来处理这个 krackle 问题https://developers.google.com/web/updates/2017/12/audio-worklet

【讨论】:

    猜你喜欢
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 2010-11-27
    相关资源
    最近更新 更多