问题标签 [web-worker]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
6113 浏览

javascript - 使用 Web Workers 优雅地降级

所以我开始听到越来越多的关于Web Workers的消息。我认为这绝对很棒,但到目前为止我还没有看到任何人真正解决的问题是如何支持尚不支持新技术的旧浏览器。

到目前为止,我能够提出的唯一解决方案是围绕 Web Worker 功能制作某种包装器,该包装器将退回到一些基于计时器的疯狂解决方案,该解决方案将模拟多线程执行。

但即使在这种情况下,如何检测网络工作者是否是当前执行 javascript 的浏览器的支持功能?

谢谢!

0 投票
5 回答
2075 浏览

javascript - 结合 Processing.js 和 Web Workers 的强大功能

我一直在阅读有关 Javascript 语言中的两个(相对)新概念的文章——Web Workers 和 John Resig 的超棒 Processing.js(好吧,并不是一个真正的新“Javascript 概念”,但你明白我的想法)。两者都在互联网上徘徊的一些很好的例子,但我还没有找到一个有效地使用这两种技术的例子。它对我来说看起来很有趣且功能强大,所以我想我最好尝试一下。

但是,我真的想不出将它们两者结合起来的最佳脚本设计……在我看来,通常在使用 Processing.js 时,一些类是“处理应用程序”中定义的。它允许您使用类似 Java 的语法来解决这个问题。然而,这些类只能在处理应用程序中访问——这是显而易见的。但是我们有了 Worker……在这个惊人的例子中,一个 Javascript 函数对象首先在一个单独的脚本中定义,如果需要 Worker 使用,Worker 脚本会导入该对象的原型和某种“螺栓”自己到它上面。

对我来说,这两者似乎不能“互换”,因为当您在 Worker 脚本中时,您无法访问您在 Processing-application 中定义的类。可能是有原因的,因为类处理类绝对不是很像 Javascript。据我所知,我必须在我的 Worker 脚本中对类进行类似的定义(以新函数原型的形式)——这对可维护性不是很好,而且看起来是非常糟糕的设计对我来说,即使我还是这个主题的新手。

我忽略了什么吗?我想要一些不应该的东西吗?还是我只是误解了一些基本概念?

谢谢您的帮助!

编辑:

继续尝试弄乱 Worker 的原型,以便像它应该为它工作的对象那样“塑造”它,但很快意识到这不是要走的路。

让我们尝试使用一个大纲:我有一个类“Ball”,除了存储一个二维位置之外,它几乎什么都不做。在每个draw()循环中,Processing.js 都会调用它的update()方法,这会使 Ball 采用一个新的位置。之后,display()调用该方法,让 Ball 在其当前位置画一个小圆圈。

没有什么复杂的开始。现在,假设确定球的新位置是一项非常昂贵的操作——例如,如果它涉及球在“复杂”引力场中的运动。如果必须在绘制之前每次都进行此计算,则至少会导致一些延迟。但是,如果您设法同时执行这些操作,则运行可能会更顺畅。所以,我想我可以在它的属性列表中给 Ball 类一个额外的“位置”数组,它将保存它所有的连续位置。当 Ball 被实例化时,它会创建一个新的 Worker,它将开始计算位置,并且每次完成后,它都会向 Ball 回传一条消息,其中包含一个新的二维位置。然后球将把这个推到它的位置数组上,

总而言之——好主意还是坏主意?如果好的话,关于如何设计这个有什么建议吗?

0 投票
4 回答
1465 浏览

javascript - 您如何在 Web Worker 中对对象进行编码以使其通过 postMessage 传递?

在内部,Firefox 将对通过 postMessage 传入和传出 Web Worker 的对象进行 JSON 编码。但是,这仅适用于 Firefox (3.6+) 的 Trunk 版本,不适用于 Firefox 3.5,因此问题实际上是如何向当前平台添加对该操作的向后支持。window.atob() 和 window.btoa() 方法之前曾被建议过,但可惜这些方法在线程内部不可用,因为它们无法访问 DOM。

Mozilla 在其开发者 wiki 上公开声明了这一点,但社区中的许多人已经注意到这种情况发生了。查看 ejohn 的博客测试:http ://ejohn.org/files/bugs/postMessage/

我已经验证了这种情况也是如此,在 3.5 中,它只传递字符串,而在 3.6 中将传递对象。

0 投票
2 回答
1202 浏览

javascript - postMessage JSON 在 Google Chrome 中是否像在 Firefox 中一样进行编码/解码?

我知道它是 HTML5 规范的一部分,但有时 WebKit 不符合规范的最新草案。

0 投票
2 回答
751 浏览

javascript - 是否允许 Web Worker 本身拥有 Web Worker 线程?

在 Firefox 3.5+ 中似乎就是这种情况,在那里我可以实例化一个 Web Worker,并在该 Worker 内部产生另一个线程。但是,该代码无法在 Google Chrome 中运行,这让我相信这要么是 Mozilla 对该规范的专有扩展,要么是 Chrome 尚未完全实现该规范。那么它是哪一个?

0 投票
1 回答
1080 浏览

javascript - 如何从 Web Worker 与 Firebug 交谈?

我的网络工作者变得越来越复杂,在与他们一起工作时我非常想念 Firebug 访问。这:

不会从网络工作者那里产生任何东西。我还尝试了以下方法:

这也不会产生任何输出。

火狐版本:

Firebug 版本 1.4X.5

0 投票
3 回答
14644 浏览

javascript - 网络工作者和画布

是否允许网络工作者访问画布对象?

0 投票
4 回答
16866 浏览

javascript - 在网络工作者之间共享变量?【全局变量?】

我有什么办法可以在两个网络工作者之间共享一个变量吗?(网络工作者基本上是 Javascript 中的线程)

在像 c# 这样的语言中,你有:

我知道这是一个不好的例子,但是在我的 Javascript 应用程序中,我有一个线程进行繁重的计算,可以分布在多个线程中[因为我有大量的数组形式的数据。数组的所有元素都是相互独立的。换句话说,我的工作线程不必关心锁定或类似的事情]

我发现在两个线程之间“共享”一个变量的唯一方法是创建一个 Getter/setter [通过原型],然后使用 postMessage/onmessage ......虽然这看起来效率很低[尤其是对象,我有将 JSON 用于 AFAIK]

LocalStorage/Database 已从 HTML5 规范中删除,因为它可能导致死锁,所以这不是一个选项 [可悲]...

我发现的另一种可能性是使用 PHP 实际上有一个 getVariable.php 和 setVariable.php 页面,它们使用 localstorage 来存储整数/字符串......再次,必须将对象 [包括数组/null] 转换为JSON...然后是 JSON.parse()'d。

据我所知,Javascript 工作线程与主页面线程完全隔离 [这就是 Javascript 工作线程无法访问 DOM 元素的原因

尽管 postMessage 有效,但速度很慢。

0 投票
3 回答
5238 浏览

javascript - 工作线程中的 window.alert

如果我将 window.alert 放在 webworker 客户端上,那么后台工作人员将停止工作。为什么会这样?

即调用者:

客户端(worker.js)

0 投票
3 回答
44002 浏览

javascript - Web Worker 的用例是什么?

我正在寻找使用Web Workers API的真实场景。