【问题标题】:How does threading help in using web workers?线程如何帮助使用网络工作者?
【发布时间】:2013-03-10 11:11:29
【问题描述】:

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

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

这对我们可以使用网络工作者做什么的限制有什么影响?

提前致谢!

【问题讨论】:

  • 或者是不是就像在 google chrome 中打开了另一个标签页,本质上和新浏览器一样,因为每个标签页都是不同的进程?
  • 网络工作者是网络服务器上的进程。您提到客户端程序是类比,但事实并非如此。查找维基百科多线程。如果你想知道它是否值得/好...它是垃圾装扮成有用的东西,有很多额外的特殊编程和陷阱。
  • @chris Web Workers 是客户端。
  • @chris:它们可能非常有用;大多数网站通常不需要它们。它们对于执行大量客户端处理的重 JS 网络应用非常有用,并且执行任何需要超过半秒的计算,例如在将大图像上传到服务器之前调整客户端的大小。

标签: javascript html performance html5-canvas


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多