我有一项CPU密集型工作要做,我不想降低用户体验。由于网络工作者(http://ejohn.org/blog/web-workers/)是一项新功能,并且不受所有浏览器的支持,我想打开一个带有HTML + JS的iframe,它将执行所有脏工作并使用一些跨域通信传递结果。 不幸的是,我注意到iframe的所有者遭受了iframe窗口的CPU工作。
此行为是否符合设计?有没有办法解决这个问题?
答案 0 :(得分:8)
模拟多线程的一种方法是让Javascript函数做一些工作,然后使用相同的函数调用setTimeout
;然后该函数将做一些工作并再次调用setTimeout
,此循环将永久持续或直到它们关闭帧或您发出信号停止工作。 MDN has a good example of how to set this up.
在超时之间,Javascript不应占用任何处理器时间。你可能需要玩一下才能看出你的超时时间应该是多长时间 - 1ms可能太短了,但1s肯定太长了。另一个因素是运行作业的计算机的处理器速度,因此您可能需要通过Javascript在客户端进行一些伪基准测试,然后才能确定每次延迟的时间。
答案 1 :(得分:4)
JavaScript是单线程的。根据浏览器的不同,单独的选项卡或窗口可以在单独的线程或进程中运行,但是您无法在这些窗口之间进行通信,因此您无法在JavaScript中显式使用多个线程或进程。
如果是UI响应的问题,Rushakoff有一个很好的答案。在JavaScript运行时,不会发生HTML呈现,并且UI没有响应。通过使用超时,可以定期将控制释放回渲染/ UI线程,从而提供更具响应性的感觉,即使它仍然只运行单线程。
答案 2 :(得分: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 标头以尝试降低它们对嵌入器的性能影响。
要使用 Origin-Agent-Cluster 标头,请将您的 Web 服务器配置为发送以下 HTTP 响应标头:Origin-Agent-Cluster: ?1
?1
的值是布尔真值的结构化标头语法。< /p>
此处有更多详细信息:https://web.dev/origin-agent-cluster/