javascript - 将 WebSockets 移入工作线程的原因

标签 javascript html websocket dom-events web-worker

关闭。这个问题是opinion-based .它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

去年关闭。




Improve this question




我正在使用 WebSockets 运行一些测试。

对于测试,我使用了基于 Alchemy-Websockets .NET 的服务器。

Web 应用程序打开多个窗口,用于监控不同的服务和系统。

我对服务器必须发送很多的高负载情况特别感兴趣
事件的客户端,以反射(reflect)实时更新。我希望 GUI 能够完全响应并在实时用户体验中以网格和图表形式呈现数据。

我在主窗口线程中创建了 WebSocket,并在每条传入消息中添加了一个条目到网格用于显示的数组 (SlickGrid)。为了使 GUI 正常工作,我添加了 20 毫秒的 setInterval 来呈现网格更新,一切正常,速度非常快。

问题是将 WebSocket 移动到工作线程是可取的还是推荐的。在阅读有关工作线程的文章时,我在用例中看到了在线程中处理 I/O 的建议。

我认为这只有在阻塞时才有意义。

据我所知,WebSocket 是异步的,不会阻塞。我在某处读到
它由浏览器在内部线程中实现,这是有道理的。

我考虑将 WebSocket 移动到一个工作器中,允许工作器在将其移动到主窗口之前缓冲或聚合一些数据,在高事件率的情况下,我看到以下方法:

  • 主窗口线程定期(每 20 毫秒左右)轮询工作线程并获取所需的数据。
  • worker 定期发送更大的数据块。
  • 每次网络套接字接收数据时,将其发送到主线程 - 但我认为它引入了相同的固有问题。 (这是我开始测试的地方,我在工作线程中创建了一个无限循环
    在我向主线程发送消息的每一步中,GUI 都卡住了
    这是有道理的)。

  • 将 WebSocket 留在主线程上也不理想。在来自服务器的高负载的情况下,GUI 不会优先处理 WebSocket 传入消息事件。

    在工作线程中收集数据,似乎我可能会错过高负载期间的实时更新,因为工作线程正在缓冲。

    工作线程的另一个问题似乎是数据重复,这可以通过较新的可传输对象来解决,但不确定所有浏览器是否支持它。

    为什么不在主窗口上托管 WebSocket?

    那么最佳实践是什么?

    最佳答案

    将 WebSocket 移至 Worker 的原因只有两个。

  • JSON.parse 是阻塞操作,在大数据的情况下会导致 FPS 损失。来自 worker 的数据克隆增加了约 1% 的开销,但 99% 的解析是在后台线程中完成的。
  • 使用 SharedWorker 只与服务器保持一个连接。
  • 关于javascript - 将 WebSockets 移入工作线程的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12534583/

    相关文章:

    javascript - 为什么我无法获得值选择和输入?

    javascript - 防止Ant模态阻止后台访问

    javascript - Firebase 值在不应定义时未定义

    javascript - 将文本分配给 Bootstrap 中的下拉按钮

    html - 如何仅使用 css 切换 <p> 与 html 链接

    opencv - 通过 Autobahn WebSocket 流式传输视频

    javascript - WebKit 请求未创建文件

    websocket - 在 Jmeter 中对 WebSocket 进行压力测试

    java - 我们可以使用 Web 套接字在微服务之间进行通信吗?

    java - 如何从 servlet 获取 JSP 的服务器文件路径?