问题标签 [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 投票
2 回答
3764 浏览

javascript - 网络工作者——他们是如何工作的?

我试图理解这个例子

HTML(主要代码):

Javascript(工作代码):

我有以下问题:

  • 工人代码何时开始运行?执行后立即var worker = new Worker("fibonacci.js");

  • onmessage = function(event) { ... }工作代码中的分配将worker.postMessage("5");在主代码之前执行,这是真的吗?

  • 工作代码可以访问在主代码中定义的全局变量(如worker)吗?

  • 主代码可以访问工作代码中定义的全局变量(如results)吗?

  • 在我看来,worker.onmessage = function(event) {...}主代码中的含义onmessage = function(event) {...}与工作代码(工作人员的onmessage事件处理程序)中的含义相同。我哪里错了?它们之间有什么区别?

  • 这段代码实际上应该做什么?当我在这里运行它时,它只打印“5”。这是它应该做的,还是我错过了什么?

非常感谢 !

0 投票
3 回答
2834 浏览

javascript - 如何防止 HTML5 Web Worker 锁定,从而正确响应来自父级的消息

我正在使用网络工作者来执行一些 CPU 密集型工作,但要求工作者将在工作者仍在处理时响应来自父脚本的消息。

但是,工作人员在被锁定在处理循环中时不会响应消息,而且我还没有找到一种方法来轮询消息队列。因此,似乎唯一的解决方案是每隔一段时间中断处理以允许处理队列中的任何消息。

显而易见的选择是使用计时器(比如使用 setInterval)但是我已经读到两次触发之间的最小延迟很长(http://ajaxian.com/archives/settimeout-delay),这是不幸的,因为它会减慢处理速度很多。

其他人对此有何看法?我将尝试让工作人员onmessage在 each 结束时将其分派给自己onmessage,从而有效地执行每个从自身收到的事件的处理循环的一个步骤,但只是想看看是否有人对此有任何想法。

谢谢,

0 投票
1 回答
1827 浏览

html - 设置 onmessage 处理程序时与网络工作者的竞争条件?

请考虑以下代码和本 Mozilla 教程“使用网络工作者”中的解释:

此示例中的第 1 行创建并开始运行工作线程。 第 2 行将 worker 的 onmessage 处理程序设置为一个函数,该函数在 worker 调用自己的 postMessage() 函数时调用。

线程在调用Worker构造函数的那一刻启动。我想知道设置onmessage处理程序是否可能存在竞争条件。例如,如果网络工作者在设置onmessage之前发布了一条消息。

有人知道更多吗?

更新:

Andrey 指出网络工作者应该在收到消息时开始工作,就像在 Mozilla 教程中的斐波那契示例中一样。但这不会在 web worker 中设置 onmessage 处理程序时创建一个新的竞争条件吗?

例如:

主脚本:

网络工作者脚本('worker.js')

然后考虑如下执行路径:

var result = [] ”行可以省略,它仍然是相同的效果。

这是一个有效的执行路径,我通过在 web worker 中设置超时来尝试它!目前我看不到,如何在不遇到竞争条件的情况下使用网络工作者?!

0 投票
2 回答
411 浏览

jquery - Web Workers and Sparklines

I know that Web Workers don't have access to the DOM, but I was wondering if there was any way they could render a Sparkline graph behind the scenes and pass it back. If not, is there ANY way I could use Web Workers to speed up the processing of around a million sparklines?

I'm trying to improve performance (see this question)

0 投票
5 回答
23061 浏览

javascript - 获取 JavaScript 中的 CPU 内核数?

有没有办法确定 JavaScript 中可用 CPU 内核的数量,以便您可以根据它调整 Web 工作者的数量?

0 投票
1 回答
2353 浏览

javascript - 在游戏中使用 Web Workers 有意义吗?

我正在开发一款具有 AI 逻辑、动作等和绘图功能的游戏。使用 Web Workers 计算移动和 AI 逻辑是否有意义?但是我该怎么做——因为工作人员需要非常了解主线程,比如某些对象的碰撞位置、子弹数量等。感觉不可能,因为工作人员与主线程完全分开没有任何访问权限。我确实知道有一个 postMessage() 系统,但感觉如此......嗯,痛苦吗?

例如,我有一个步枪手对象,它代表具有精灵、位置、健康等的步枪手。我希望他巡逻。那么,我该如何在工人身上执行巡逻代码呢?它几乎需要对该对象的全部访问。

0 投票
5 回答
55830 浏览

javascript - Node.js 和 CPU 密集型请求

我已经开始修改 Node.js HTTP 服务器,并且非常喜欢编写服务器端 Javascript,但是有些东西让我无法开始在我的 Web 应用程序中使用 Node.js。

我了解整个异步 I/O 概念,但我有点担心过程代码非常占用 CPU 的边缘情况,例如图像处理或对大型数据集进行排序。

据我了解,对于简单的网页请求,例如查看用户列表或查看博客文章,服务器将非常快。但是,如果我想编写非常 CPU 密集型代码(例如在管理后端)来生成图形或调整数千张图像的大小,那么请求将非常慢(几秒钟)。由于此代码不是异步的,因此在这几秒钟内到达服务器的每个请求都将被阻止,直到我的慢速请求完成。

一个建议是使用 Web Workers 来处理 CPU 密集型任务。但是,我担心网络工作者会很难编写干净的代码,因为它通过包含一个单独的 JS 文件来工作。如果 CPU 密集型代码位于对象的方法中怎么办?为每个 CPU 密集型方法编写一个 JS 文件有点糟糕。

另一个建议是生成一个子进程,但这会使代码更难维护。

有什么建议可以克服这个(感知的)障碍吗?如何使用 Node.js 编写干净的面向对象代码,同时确保 CPU 繁重的任务异步执行?

0 投票
1 回答
1095 浏览

php - 来自 Firefox 网络工作者的异步 POST 请求

我正在尝试从我的扩展中使用的网络工作者使用 POST 方法发出异步请求。问题是它对我不起作用。在服务器端,我有 PHP 脚本监听 $_POST 变量中的数据。尽管我能够建立与服务器的连接,甚至可以在 URL (GET) 中传递一些数据,但 $_POST 始终为空。

这是我在网络工作者中使用的最新代码:

(当我知道问题是同源策略时,从 MDN 网站借来的)

在此之前,我使用了一个相当明显且非常简单的方法:

在这种情况下,请求也通过了,但 $_POST 仍然是空的。

网络工作者是否可能不允许 POST 请求?

现在一切都在 localhost 上进行测试。

0 投票
2 回答
4157 浏览

cross-domain - 使用 JSONP 和 Web Workers 的跨域资源共享 (CORS)

我正在寻找如何在 Web Worker 中使用 JSONP 从/向另一个域获取/发送数据的解决方案。

由于 Web Worker 无法访问 DOM,因此无法将<script>带有 url 和回调参数的<head>标签附加到来自 Web Worker 的标签上。

有谁知道,如何使用 JSONP 和 Web Worker 从/向另一个域获取/发布数据?

谢谢,

0 投票
3 回答
4748 浏览

html - 强制重新加载/阻止 Web Worker 的缓存

我注意到即使您强制页面重新加载(SHIFT+F5 等),大多数浏览器(尤其是 Chrome)似乎也会缓存 Web Worker 脚本。我发现强制更新缓存的唯一可靠方法是将工作脚本的路径键入地址栏中并强制单独重新加载。

显然,在尝试开发任何东西时,这是一种皇家痛苦。有谁知道一种可靠的方法来阻止浏览器缓存工作脚本或强制它以简单的方式重新加载它们?