0

我有一个关于网络工作者的一般性问题。我知道他们在另一个线程中进行后台计算,因此他们从用户所在的窗口中卸下负载。

但是,我对“其他线程”是否意味着在计算机上运行不同的程序,打开单独的浏览器,或者是否就像同一浏览器中的新标签感到困惑。我觉得这更多是后一种情况,但我对此不是 100% 确定,也找不到好的解释。

这对我们可以使用 Web Worker 做什么的限制有什么影响?

提前致谢!

4

1 回答 1

3

webworker 就像一个独立的执行线程一样工作。多个线程可以在一个计算机进程中同时运行。如果有多个处理器,这些多个线程实际上可以同时运行。如果只有一个处理器,那么计算机上的操作系统会处理不同线程之间的时间片,这样每个线程都会运行一小段时间,然后下一个会运行,对于不经意的观察者来说,它们似乎正在运行同时。

在浏览器中,webworker 确实是一个独立于浏览器窗口线程(在浏览器中打开的每个浏览器页面都有一个)运行的执行线程。浏览器窗口线程有许多限制。主要限制是它仅在没有 javascript 代码也在主浏览器线程中运行时处理用户事件(鼠标移动、鼠标单击、键盘事件等)。因此,如果您要在主浏览器线程中运行一些长时间运行的 javascript 代码,浏览器将“看起来”被锁定,并且在该 javascript 运行时不会处理任何用户事件。这通常被认为是糟糕的用户体验。

但是,如果你在 webworker 中运行这个 javascript,它可以在不阻塞主浏览器窗口线程中的事件处理的情况下完成长时间运行的事情。当它完成其长时间运行的计算时,它可以向主浏览器窗口线程发送一条消息,并且可以处理结果(例如显示在页面中或任何特定操作)。

有一些方法可以解决主浏览器线程的限制,方法是将您的工作分成小块并在循环计时器上执行小块工作。但是,使用 Web Worker 线程可以显着简化编程。

Web 工作者本身无法以任何方式访问浏览器页面。他们不能从中读取值或修改它 - 他们不能运行动画等......这将它们的有用性限制在更独立于页面的任务上。经典用途是一些长时间运行的计算(例如分析图像中的数据、执行 ajax 调用、进行一些复杂的计算等)。Web Worker 可以通过消息系统与主线程进行通信。这有点像留下语音邮件。webworker 调用主线程并给它留言。下次当主线程无事可做时,它会检查是否有来自 web worker 的消息,如果有,它会处理它们。这样,主线程和 web worker 线程可以通信,但一个不能中断另一个'

于 2013-03-21T04:23:13.253 回答