线程如何帮助使用web worker

How does threading help in using web workers?

本文关键字:web worker 帮助 何帮助 线程      更新时间:2023-09-26

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

然而,我对"其他线程"是否意味着在计算机上运行不同的程序,打开单独的浏览器,或者是否像在同一浏览器中的新选项卡感到困惑。我觉得这更像是后一种情况,但我不能百分百确定,我也找不到好的解释。

这对我们可以用网络工作者做的事情的局限性有什么影响?

提前感谢!

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

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

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

有一些方法可以绕过主浏览器线程的限制,将你的工作分成小块,并在一个循环计时器上执行小块的工作。但是,使用web worker线程可以大大简化编程。

Web工作者自己不能以任何方式访问浏览器页面。他们不能读取它的值或修改它——他们不能运行动画,等等……这在一定程度上限制了它们对于独立于页面的任务的用处。经典的用法是一些长时间运行的计算(例如,从图像分析数据,执行ajax调用,做一些复杂的计算,等等…)。Web工作者可以通过消息传递系统与主线程通信。这有点像留语音信息。webworker调用主线程并为它留下一条消息。下一次主线程无事可做时,它检查是否有来自web worker的消息,如果有,就处理它们。通过这种方式,主线程和web worker线程可以通信,但是当一个线程正在做其他事情时不能中断另一个线程。