线程如何帮助使用web worker
How does threading help in using web workers?
我有一个关于网络工作者的普遍问题,我很难解决。我知道它们在另一个线程中进行后台计算,因此它们从用户所在的窗口中卸下负载。
然而,我对"其他线程"是否意味着在计算机上运行不同的程序,打开单独的浏览器,或者是否像在同一浏览器中的新选项卡感到困惑。我觉得这更像是后一种情况,但我不能百分百确定,我也找不到好的解释。
这对我们可以用网络工作者做的事情的局限性有什么影响?
提前感谢!
webworker就像一个独立的执行线程。在一个计算机进程中,多个线程可以同时运行。如果有多个处理器,这些线程实际上可以同时运行。如果只有一个处理器,那么计算机上的操作系统处理不同线程之间的时间切片,这样每个线程运行一小段时间,然后下一个线程运行,对于偶然的观察者来说,它们似乎同时运行。
在浏览器中,webworker实际上是一个独立于浏览器窗口线程运行的执行线程(浏览器中打开的每个浏览器页面都有一个窗口线程)。浏览器窗口线程有许多限制。主要的限制是,它只处理用户事件(鼠标移动,鼠标点击,键盘事件等),当没有javascript代码也在主浏览器线程中运行。因此,如果你要在主浏览器线程中运行一些长时间运行的javascript代码,浏览器将"看起来"被锁定,并且在javascript运行时不会处理任何用户事件。这通常被认为是糟糕的用户体验。
但是,如果你在一个webworker中运行这个javascript,它可以去做它长时间运行的事情,而不会阻塞主浏览器窗口线程中的事件处理。当它完成长时间运行的计算后,它可以向主浏览器窗口线程发送消息,然后可以处理结果(例如显示在页面中或任何特定的操作)。
有一些方法可以绕过主浏览器线程的限制,将你的工作分成小块,并在一个循环计时器上执行小块的工作。但是,使用web worker线程可以大大简化编程。Web工作者自己不能以任何方式访问浏览器页面。他们不能读取它的值或修改它——他们不能运行动画,等等……这在一定程度上限制了它们对于独立于页面的任务的用处。经典的用法是一些长时间运行的计算(例如,从图像分析数据,执行ajax调用,做一些复杂的计算,等等…)。Web工作者可以通过消息传递系统与主线程通信。这有点像留语音信息。webworker调用主线程并为它留下一条消息。下一次主线程无事可做时,它检查是否有来自web worker的消息,如果有,就处理它们。通过这种方式,主线程和web worker线程可以通信,但是当一个线程正在做其他事情时不能中断另一个线程。
- Web Worker postMessage({})何时返回给调用者
- Web Worker 能否利用 100% 的多核 CPU
- 三.js:如何从Web-worker加载动画.json模型
- 从 Web Worker 执行 AJAX 请求是否可行
- 在Web Worker中将SVG转换为PNG
- 如何通过HTTPS加载Web Worker脚本
- 当浏览器关闭时,运行Web Worker会发生什么情况
- JavaScript:不允许Web Worker使用(例如)XmlHttpRequest
- 在 HTML5 Web Worker 中使用地理位置
- 无法在 Firefox 35 插件中创建内联 Web Worker
- Javascript - 等待 Web worker 完成
- 如何使用 Web worker 加载内联 Javascript
- JavaScript 函数可以检查它是否在 Web Worker 线程上运行吗?
- 在 Web worker 上使用 CamanJS
- Javascript Web Worker 修改全局对象
- 使用 Web Worker 和 D3.js 异步生成图形
- 多个 Web Worker ajax 请求,但并非所有请求都返回
- 这个 Web worker 代码是多线程的吗,我是否获得了什么
- 如何在 Web Worker 中访问 Chrome API
- JavaScript Web Worker close() 不起作用