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

javascript - Javascript中的重计算

我目前正在为 Javascript(浏览器和节点)构建财务库

该库的主要功能之一是使用选项进行模拟,因此生成模拟时需要进行大量计算。

我目前正在使用我编写的名为 AsyncManager 的库,它使用 HTML5 webworkers(node-webworker) 并将计算分配给一定数量的 webworkers。我这样做的方法是序列化 javascript 计算对象(Calc 对象必须实现一种称为计算(args)的方法),包括函数。

(我通过将函数更改为它们自身的字符串形式来进行函数序列化,然后我在 webworker 中对它们进行评估以将它们转换回函数。)

我想知道是否有人在不提前知道计算的情况下想到了一种更好的方法来使用 webworkers 在 javascript 中分配负载。

0 投票
3 回答
15056 浏览

javascript - 可靠地检测脚本是否在 web worker 中执行

我目前正在用 JavaScript 编写一个小库,以帮助我将一些繁重的计算委托给网络工作者。

出于某些原因(主要是为了能够在 UI 线程中进行调试,然后在工作线程中运行相同的代码),我想检测脚本当前是在工作线程中运行还是在 UI 线程中运行。

我不是经验丰富的 JavaScript 开发人员,我想确保以下函数能够可靠地检测我是否在工作人员中:

那么,是吗?

0 投票
1 回答
543 浏览

javascript - JavaScript 中不干扰 UI 交互的后台任务

我正在开发一个用 JavaScript 实现的移动应用程序,它必须做很多后台工作——主要是从服务器(通过 JSONP)获取数据并使用本地存储将其写入数据库。在前台,用户可以在本地存储的数据上导航,因此想要一个反应流畅的应用程序。

这种交互(通过 JSONP 从服务器获取数据并在对其进行一些小的工作之后,将其存储在本地数据库中)是异步完成的,但是由于 JSONP 和数据库交互的必要 DOM 操作,我无法使用它网络工作者。因此,我遇到了用大量“后台处理请求”阻塞 JavaScript 事件队列的问题,并且应用程序反应非常缓慢(甚至完全锁定)。

这是我做背景工作的方式的一个小草图:

我已经阅读了一些关于 JavaScript 中事件处理机制的资料(即John Resigs 对使用计时器的描述),但我真正想做的是:检查事件队列中是否有事情要做。如果是这样,请等待 100 毫秒并再次检查。如果队列中当前没有任何等待,则处理少量数据并再次检查。

据我所知,这是不可能的,因为 JavaScript 不能直接访问事件队列。

那么有没有什么设计思路可以优化我的代码,更接近不干扰UI事件的目标,给用户一个流畅的App交互呢?

0 投票
4 回答
24300 浏览

javascript - 使用 Web Workers 使用本机画布函数进行绘图

可以将CanvasPixelArray获得的 via发送getImageData到工作脚本,并让工作脚本在其后台线程中操作像素,并最终将操作后的像素数组发回。

但是,我使用的是原生画布绘图功能,例如drawImage. 这些drawImage调用当前正在阻塞 UI 线程。这会导致按钮重绘缓慢,并且在单击按钮时会出现明显的延迟,仅举几个缺点。(编辑:现在可以使用 来完成一个小的改进ctx.imageSmoothingEnabled = false,至少在带有webkit前缀的 WebKit 上。)

我想使用 Web Workers 将绘图从主线程移动到后台线程。但是,我似乎无法将画布或上下文发送给工作人员。

我确实在 MDN 上找到了这个通知

注意:像往常一样,后台线程(包括工作线程)不能操作 DOM。如果后台线程采取的操作需要导致对 DOM 的更改,他们应该将消息发回给他们的创建者来完成这项工作。

但我想保留 DOM 原样;我只是想在画布元素上画东西。这可能吗,还是 Web Workers 真的只允许计算而不允许绘制?

(或者是否可以使用诸如drawImage操作 aCanvasPixelArray而不是在画布上绘图之类的功能?)

0 投票
2 回答
1380 浏览

javascript - 网络工作者不在 Firefox 8 中工作,在 Firefox 7 中工作

我正在使用名为arbor.js 美化的库。它包含以下代码行,

此时抛出错误,Firebug中报如下信息,

“无法获得域名!”

给出此错误的行是 258。该arbor_path()行上的函数返回"js/",因此有效调用的函数是i = new Worker("js/arbor.js")

这曾经在 Firefox 7 中完美运行。有人知道如何解决它,或者问题可能是什么?

0 投票
2 回答
379 浏览

android - 移动浏览器网络工作者和离线存储支持

是否有任何移动浏览器(Android、ios)支持 Webworker 和离线存储?

与桌面浏览器(大小、资源等)相比,是否有任何限制?

0 投票
2 回答
3716 浏览

javascript - JavaScript:这个计时器可靠吗?

今天我被介绍到 JavaScript 中的 Web Workers 的世界。这让我重新思考了计时器。我曾经以丑陋的方式对计时器进行编程,就像这样。

我知道这可以通过保存启动计时器的日期来改善,但我从来都不喜欢这样做。

现在我想出了一个使用 Web Workers 的方法,我做了一个小基准测试,发现它更可靠。由于我不是 JavaScript 方面的专家,我想知道这个函数是否正常工作或者它可能有什么问题提前感谢。

我的 JavaScript 代码(请注意我使用 JQuery):

外部脚本('scripts/task.js'):

您还可以在我的网站上查看现场演示。

0 投票
3 回答
4884 浏览

javascript - 使用 JavaScript Web Workers 进行并行编程/同步

是否有任何同步原语,如BarriersSemaphorsLocksMonitors ......在 JavaScript / Web Workers 中可用,或者是否有一些可用的库使我能够使用这些东西(我正在考虑类似 java.util.concurrent在Java中)?

Worker 是否具有将它们与线程区分开来的模糊属性(例如,它们可以与主线程共享内存)?是否有某种限制可以产生多少工人(例如,出于安全原因或其他原因......)?我需要特别注意什么吗?

0 投票
1 回答
1237 浏览

javascript - 如何进行工人与工人的沟通?

我正在尝试使用网络工作者,并且想知道他们将如何处理令人尴尬的并行问题。因此,我实施了 Connaway 的 Game of Life。(比做模糊或其他事情更有趣。但是在那种情况下问题是一样的。)

目前,我有一个网络工作者执行迭代并为 UI 线程发回新的 ImageData 以放置在我的画布中。效果很好。

然而,我的实验并没有就此结束,因为我有几个可用的 CPU 并且想要并行化我的应用程序。

因此,首先,我将我的数据分成两部分,从中间向下,让两个工人每人处理一半。问题当然是分裂。工人 A 需要来自工人 B 的一列像素,反之亦然。现在,我可以通过让我的 UI 线程将该列交给工作人员来清楚地解决这个问题,但如果我的线程可以直接将它们传递给彼此会更好。

当进一步拆分时,每个工作人员只需要跟踪它的相邻工作人员,并且 UI 线程将只负责更新 UI(应该如此)。

我的问题是,我不知道如何实现这种工人对工人的沟通。我尝试通过初始化 postMessage 将邻居交给彼此,但这会复制我的工作人员而不是传递参考,幸运的是,chrome 警告我这是不可能的。

最后我看到有一个叫做 a 的东西SharedWorker。这是我应该研究的,还是有办法使用Worker它来解决我的问题?

0 投票
0 回答
695 浏览

javascript - 使用 JavaScript 同时按下计时器和按钮

在我的 Web 应用程序中,用户会看到一个倒数计时器(每秒更新剩余的分钟数和秒数),并且可以按“+1”和“-1”按钮来增加总值。(用例是计算用户在给定的分钟数内可以看到的人数。)

我正在使用setInterval,但它遇到的问题是只有一个执行线程:当用户按下 +1 和 -1 按钮时,它会中断计时器并关闭显示。

在桌面上,也许一个单独的 Flash 电影用于计时器显示是一种解决方案。我们的用户也在 iPad 上使用 Web 应用程序,因此 Flash 不是一个选项。还有其他建议吗?PhoneGap 包装器可以允许多个线程吗?

或者WebWorkers呢?我想问题在于工作线程无法访问 DOM 来编辑计时器显示。