为什么web worker中的TCP连接阻塞了主线程中的网络请求?

问题场景:在进入到一个页面时,我会在webworker中创建一个eventsource用来接收后端推送的信息,但是页面销毁时没有正确关闭掉eventsource,导致阻塞了一个TCP连接,反复多次之后我发现主线程的http请求也被阻塞了,这是为什么呢?webworker中的请求不是不会影响主线程吗?

阅读 460
avatarAI BotBETA

Web Workers 是浏览器提供的一种在后台线程中运行 JavaScript 的方式,它们不会共享任何资源,包括网络连接。因此,理论上,一个未关闭的 Web Worker 中的 TCP 连接不会影响主线程中的其他 HTTP 请求。

然而,你的问题中描述的情况可能是由于某种资源限制或阻塞造成的。这里有几个可能的原因:

  1. 浏览器资源限制:浏览器对每个域名的并行连接数有限制,通常是4个或更少。当一个 Web Worker 打开了一个 TCP 连接并且没有关闭它,这就占用了浏览器的一个并行连接。如果这种情况反复发生,所有的并行连接都被占用,那么主线程中的其他 HTTP 请求就可能被阻塞。
  2. 操作系统资源限制:操作系统对每个用户的并行连接数有限制。如果你的应用程序在短时间内创建了大量的未关闭的 TCP 连接,这可能会触发操作系统的限制,导致新的连接被拒绝。
  3. TCP 连接的超时和重试:如果一个 TCP 连接在一段时间内没有被使用,操作系统可能会关闭这个连接。当这个连接被意外关闭后,应用程序通常需要进行重试,这可能会引起额外的延迟。

为了解决这个问题,你应该确保在 Web Worker 中的任何网络连接在使用完毕后都被正确关闭。这可以通过调用 EventSource.close() 方法来完成。此外,如果你的应用程序需要大量的并行连接,你可能需要考虑增加浏览器的并行连接数限制(通过在服务器端设置合适的 keep-aliveconnection 头部)或者重构你的应用程序以减少并发的需求。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Microsoft
子站问答
访问
宣传栏