我目前正在写一个程序,在那里我必须处理巨大的数组。但是我可以拆分这些数组。我现在的计划是,在不同的Web工作器中处理数组。但是我从来没有使用过它们,并且确实有几个问题:
- 1.**如何运行多个Web工作者?我尝试了一个如下所示的for循环:
for(i = 0; i < eD.threads; i++){
//start workers here
var worker = new Worker("js/worker/imageValues.js");
worker.postMessage(brightness, cD.pixels[i]);
}
在这里我得到了错误,对象不能被克隆。这似乎是合乎逻辑的。我想这将是更好地保存在一个数组?
- 2.**我如何控制所有人都完成了他们的工作?(我需要重新组装数组,稍后再处理它)
- 3.**有多少网络工作者真正带来了改进?
- 4.**除了MDN条目之外,是否还有其他高级教程?
谢谢大家!
2条答案
按热度按时间7gyucuyw1#
1.我如何运行多个Web工作者呢?我尝试了一个如下所示的for循环:
创建一个以上的worker没有问题,即使您没有在数组中跟踪它们。
2.我如何控制所有人都完成了他们的工作?(我需要重新组装数组并在以后使用它)
他们可以在完成后给你发一条消息,告诉你结果。
3.有多少网络工作者真正带来了进步?
一个字符串的长度是多少?:-)答案取决于运行它的目标机器,运行代码的性质以及它使用的其他资源等。你必须针对你的目标环境和任务进行调整。你可以在浏览器上使用
navigator.hardwareConcurrency
,在Node.js上使用Deno或os.cpus
来找出有多少个内核可用,但记住你是在与机器上的其他进程共享这些内核,而不仅仅是你的JavaScript代码在运行。4.除了MDN入门,还有其他高级教程吗?
关于Web工作者没有太多的"高级"。:-)我发现this article已经足够了。
下面是一个运行五个工作线程并等待它们完成的示例:
主窗口:
worker.js
:关于不存在的争用条件:如果您从真正的抢占式线程的Angular 来考虑,那么您可能会认为:我可以创建一个worker,将
running
递增到1
,然后在创建下一个worker之前,我可以从第一个worker获得完成的消息,将running
递减到0
,并错误地认为所有worker都已完成。这在Web辅助进程工作的环境中是不可能发生的。尽管环境可以在它喜欢的时候启动辅助进程,并且辅助进程可以在启动辅助进程的代码完成之前完成,所要做的只是将主JavaScript线程对
workerDone
函数的调用 * 排队 *,没有抢占。所以我们知道在第一次调用workerDone
之前所有的工作线程都已经启动了,所以当running
是0
时,我们知道它们都已经完成了。最后说明:在上面的代码中,我使用
onmessage = ...
来连接事件处理程序,这自然意味着我只能在对象上使用一个事件处理程序,如果您需要为message
事件使用多个处理程序,使用addEventListener
。所有支持Web工作者的浏览器都支持addEventListener
(您不必担心IEattachEvent
的问题)。waxmsbnn2#
stiller_leser.如果你还在解决这个问题,看看ng-vkthread插件。它允许你实现并行计算技术,这是你在项目中尝试开发的。使用这个插件,你可以在多个线程中同时执行多个函数。
函数可以直接在主线程中定义,也可以从外部JavaScript文件中调用。
功能可以是:
基本用途:
示例和API文档:http://www.eslinstructor.net/ng-vkthread/demo/
希望这能帮上忙,