【问题标题】:Does iframe runs on the same thread as the owner?iframe 是否与所有者在同一线程上运行?
【发布时间】:2010-11-29 18:34:19
【问题描述】:

我有一个 CPU 密集型工作要做,我不想降低用户体验。由于网络工作者 (http://ejohn.org/blog/web-workers/) 是一项新功能,并非所有浏览器都支持,我想打开一个带有 HTML + JS 的 iframe,它将完成所有脏活,并使用一些跨域通信来传递结果. 不幸的是,我注意到 iframe 的所有者受到 iframe 窗口的 CPU 工作的影响。

这种行为是否符合设计?有没有办法解决这个问题?

【问题讨论】:

    标签: javascript multithreading iframe


    【解决方案1】:

    截至 2021 年初,现在有(奇怪的名称)Origin-Agent-Cluster 标头,可让您为 iframe 请求专用资源。它目前在 Chrome (88+) 上得到支持,并得到 Mozilla 和 Safari 的好评。

    Origin-Agent-Cluster 是一个新的 HTTP 响应头,它指示浏览器阻止同站点跨域页面之间的同步脚本访问。浏览器也可能使用 Origin-Agent-Cluster 来暗示您的源应该获得自己的独立资源,例如专用进程。

    [...] 例如,如果 https://customerservicewidget.example.com 期望使用大量资源进行视频聊天,并将嵌入到整个 https://*.example.com 的各个来源,则维护该小部件的团队可以使用 Origin-Agent-Cluster header 以尝试减少它们对嵌入器的性能影响。

    要使用 Origin-Agent-Cluster 标头,请将您的 Web 服务器配置为发送以下 HTTP 响应标头:Origin-Agent-Cluster: ?1 ?1 的值是布尔真值的结构化标头语法。

    更多详情:https://web.dev/origin-agent-cluster/

    【讨论】:

      【解决方案2】:

      模拟多线程的一种方法是让 Javascript 函数做一些工作,然后使用相同的函数调用 setTimeout;然后该函数将做一些工作并再次调用setTimeout,这个循环将永远持续下去,或者直到他们关闭框架或您发出停止工作的信号。 MDN has a good example of how to set this up.

      在超时之间,Javascript 不应消耗任何处理器时间。您可能需要稍微尝试一下,看看您的超时时间应该多长——1ms 可能太短了,但 1s 肯定太长了。另一个因素是运行作业的计算机的处理器速度,因此您可能需要通过 Javascript 在客户端进行一些伪基准测试,然后才能确定每次延迟多长时间。

      【讨论】:

      • 16ms 是屏幕刷新,我推荐。
      【解决方案3】:

      JavaScript 是单线程的。根据浏览器的不同,单独的选项卡或窗口可能在单独的线程或进程中运行,但是您无法在这些窗口之间进行通信,因此您无法在 JavaScript 中显式使用多个线程或进程。

      如果是 UI 响应性的问题,Rushakoff 有一个很好的答案。在 JavaScript 运行时,不会发生 HTML 渲染,并且 UI 没有响应。通过使用超时,可以定期将控制释放回渲染/UI 线程,从而提供更灵敏的感觉,即使它仍然只运行单线程。

      【讨论】:

      • > 但是您无法在这些窗口之间进行通信 postMessage
      猜你喜欢
      • 2016-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-21
      • 1970-01-01
      • 1970-01-01
      • 2023-02-06
      • 1970-01-01
      相关资源
      最近更新 更多