我有一个普遍的问题,我在解决网络工作者方面遇到了麻烦。我知道他们在另一个线程中进行后台计算,因此他们从用户所在的窗口中取消负载。
但是我很困惑“其他线程”是否意味着在计算机上运行不同的程序,打开一个单独的浏览器,或者它是否像在同一浏览器中的新选项卡。我觉得这更多是后一种情况,但我不是百分之百确定,我找不到好的解释。
这对我们可以对网络工作者做些什么的限制有何影响?
提前致谢!
答案 0 :(得分:3)
webworker就像一个独立的执行线程。多个线程可以在计算机进程中同时运行。如果有多个处理器,这些多个线程实际上可以同时运行。如果只有一个处理器,则计算机上的操作系统处理不同线程之间的时间切片,使得每个线程运行一段时间,然后下一个运行,并且对于不经意的观察者,它们似乎在Sametime中。
在浏览器中,webworker确实是一个独立于浏览器窗口线程运行的执行线程(浏览器中每个浏览器页面都有一个线程)。浏览器窗口线程有许多限制。主要限制是它只在主浏览器线程中没有运行javascript代码时处理用户事件(鼠标移动,鼠标点击,键盘事件等...)。因此,如果您要在主浏览器线程中运行一些长时间运行的javascript代码,浏览器将“显示”被锁定,并且在javascript运行时不会处理任何用户事件。这通常被认为是糟糕的用户体验。
但是,如果你在webworker中运行这个javascript,它可以在不阻塞主浏览器窗口线程中的事件处理的情况下进行长时间运行。当它完成其长时间运行的计算时,它可以向主浏览器窗口线程发送消息,并且可以处理结果(例如,在页面中显示或者特定动作是什么)。
通过将工作分成小块并在定期计时器上执行小块工作,有很多方法可以解决主浏览器线程的局限性。但是,使用Web工作线程可以显着简化编程。
Web worker本身无法以任何方式访问浏览器页面。他们无法从中读取值或修改它们 - 它们无法运行动画等等......这会将它们的有用性限制为更独立于页面的任务。经典的用法是一些长时间运行的计算(例如,从图像分析数据,执行ajax调用,进行一些复杂的计算等等)。 Web worker可以通过消息传递系统与主线程进行通信。这有点像留下语音邮件。 webworker调用主线程并为其留下一条消息。下一次主线程无关时,它会检查是否有来自Web worker的消息,如果是,则会处理它们。通过这种方式,主线程和Web工作线程可以进行通信,但是当它正在做其他事情时,不能打断另一个。