Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何防止HTML5Web工作人员锁定,从而正确响应来自父级的消息_Javascript_Html_Web Worker - Fatal编程技术网

Javascript 如何防止HTML5Web工作人员锁定,从而正确响应来自父级的消息

Javascript 如何防止HTML5Web工作人员锁定,从而正确响应来自父级的消息,javascript,html,web-worker,Javascript,Html,Web Worker,我使用web workers来做一些CPU密集型工作,但要求worker在处理过程中响应来自父脚本的消息 然而,当工作进程被锁定在处理循环中时,它不会响应消息,而且我还没有找到一种方式来表示轮询消息队列。因此,似乎唯一的解决方案是每隔一段时间中断处理,以允许服务队列中的任何消息 显而易见的选择是使用计时器(比如setInterval),但是我已经读到,两次触发之间的最小延迟相当长(),这很不幸,因为它会大大降低处理速度 其他人对此有何看法?我将尝试在每个onmessage的末尾将worker分派

我使用web workers来做一些CPU密集型工作,但要求worker在处理过程中响应来自父脚本的消息

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

显而易见的选择是使用计时器(比如setInterval),但是我已经读到,两次触发之间的最小延迟相当长(),这很不幸,因为它会大大降低处理速度

其他人对此有何看法?我将尝试在每个
onmessage
的末尾将worker分派给自己,从而有效地实现每个从自身收到的事件的处理循环的一个步骤,但只是想看看是否有人对此有任何想法


谢谢,

一个工人可以产生子工人。您可以让主工作进程充当消息队列,当它收到长时间运行的操作请求时,生成一个子工作进程来处理该数据。然后,子工作线程可以将结果发送回主工作线程,以从队列中删除事件并将结果返回主线程。这样,您的主要工作人员将始终可以自由地侦听新消息,并且您可以完全控制队列


--尼克

也有同样的问题,我搜索了网络工作者的草稿,在第9步到第12步的部分中找到了一些东西。据我所知,开始处理任务的工作人员在第一个任务完成之前不会处理另一个任务。因此,如果您不关心停止和恢复任务,nciagra的回答应该比重新安排任务的每个迭代具有更好的性能


不过仍在调查中。

我自己第一次和工人们玩的时候就遇到了这个问题。我还讨论了使用setInterval,但我觉得这是解决问题的一种相当粗糙的方法(我已经用这种方法模拟了多线程)。相反,我决定从主线程(worker.terminate())终止worker,并在需要中断它们所涉及的任务时重新创建它们。垃圾收集等似乎是在我的测试中处理的

如果有来自这些任务的数据需要保存,则始终可以定期将其发回主线程进行存储,如果有一些逻辑需要实现,则可以定期将相关数据发回,以允许终止

产生子工作者将导致同样的问题;根据某些逻辑,您仍然需要终止子工作程序(或创建新的子工作程序),我不确定它是否得到了很好的支持(例如在chrome上)


詹姆斯

我认为如果必须停止并恢复计算,这将不起作用。我还没有找到解决这个问题的办法。示例:@nciagra,这个答案行不通:你只是把问题往上推了一步。那么,如果你产生了子员工呢?现在,这些子工作人员正忙于计算,您不能从主工作人员那里中断它们。我猜(现在在webworker本身中)是我们需要中断worker的唯一方法,webworker非常需要真正的中断机制,就像Java可以做的那样。有同样的问题,使用相同的解决方案。为了不破坏webworker所做的计算,我每隔一段时间将计算出的数据发布到父“窗口”,然后在重新启动webworker时,我从迄今为止计算出的结果开始不幸的是,worker.terminate()泄漏内存。。。如果偶尔使用,它可能会工作,但在我的特定情况下,它会很快挂起浏览器