【问题标题】:Stopping a webworker whilst its processing a large amount of data?在处理大量数据时停止网络工作者?
【发布时间】:2015-08-05 05:14:55
【问题描述】:

我想使用 Web Worker 以块的形式处理图像数据并将过滤器应用于图像数据,因为直接在 UI 线程上工作似乎很慢。 (我的问题并不特定于总体方案中的图像数据处理)

我提出解决方案时的主要问题是,如果我要将正在处理的图像拆分成块,然后将该数据发送给 Web Worker,我仍然希望能够通过以下方式取消处理向网络工作者发送另一条消息。我的假设是,如果我使用传统循环(而不是产生的递归函数)来处理数据,那么在该过程完成之前我将无法接收更多消息(否定发送取消消息的有用性)。

是这样吗?我还没有尝试过,但我想知道是否值得我以某种方式在网络工作者本身中进一步拆分这些数据,以便它可以继续接收更多消息并处理它们。

如果拆分是最好的方法,您将如何实现基本收益?我认为这将是某种 1 毫秒的超时,然后允许事件循环处理传入的消息,然后让我的进程函数从它停止的地方开始,但如果这不是这样做的方法,有人可以建议另一个吗?

【问题讨论】:

  • 只需使用生成器,每 100 次迭代产生一次,并由 setTimeout 恢复。
  • 是的,听起来不错。当然,你也可以.terminate()工作人员,不知道你想取消什么样的取消,需要多久取消一次。
  • 我考虑过使用 .terminate() 但我认为重新创建网络工作者的开销会在一定程度上破坏拥有它们的好处。我认为可能会经常调用取消事件,因为我想要滑块,并且取决于用户输入是否在处理之前更改了值,这很可能会减慢速度。

标签: javascript web-worker


【解决方案1】:

您可以使用您的主要网络工作者来生成子工作者,而不是“屈服”……所以让您为图像处理生成的主要网络工作者处理来自主 UI 线程的传入消息,以及创建块它发布给自己的子工作者的图像处理任务的数据。这样,您可以根据从主 UI 线程传入的消息轻松终止或管理任何子工作人员,并且您的主网络工作人员始终保持响应而不会阻塞,需要某种形式的“屈服”,或者等待一些固定的超时时间,然后才能再次响应消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 2014-05-29
    • 2016-09-03
    • 1970-01-01
    • 2012-04-03
    • 2022-01-22
    • 2019-11-01
    相关资源
    最近更新 更多