是否可以在外部暂停/恢复网络工作者?

时间:2019-08-29 00:18:40

标签: javascript multithreading threadpool web-worker

我已经看到Web工作者具有Terminate()函数,但是有没有办法像中断一样从主机线程中暂停和恢复Web工作者?

这个问题的关键因素是,对Web worker进行terminate()调用会破坏该worker内部的状态(并且所发生的任何操作都可能在半完成状态下被破坏。)我们正在寻找一种机制,该机制可以在容纳在众多任务中的数十万个任务之间进行切换,而这些任务却等于机器上的总内核,而又不会丢失这些任务中的状态或依赖于像光纤这样的协作多线程样式。

1 个答案:

答案 0 :(得分:1)

  

是否可以在外部暂停/恢复网络工作者?

不。如果没有来自webWorker本身的合作,浏览器javascript无法从外部暂停Web Worker。

一种变通方法(与webWorker协作)将涉及到webWorker运行一些代码,然后允许消息从外界到达,要求其暂停,然后webWorker本身不调用下一个单元。直到收到消息以恢复处理为止。但是,因为即使webWorkers都是事件驱动的,所以您直到完成所要完成的工作并返回到事件系统后,才能收到外界的消息。

这可能涉及执行大量工作,从现在开始仅设置几毫秒的计时器以允许消息到达,然后在消息到达时存储新的暂停/恢复状态,然后在定时器触发时,您检查状态,如果状态已暂停,则不调用下一个工作单元。如果不是暂停状态,则执行下一个工作单元,并在完成后,在很短的时间内再次执行setTimeout()(允许处理任何待处理的消息),并不断重复。

不幸的是,此技术要求您分块工作,从而首先抵消了webWorkers的某些好处(尽管您仍然保留使用多个CPU处理工作的好处)。

  

我正在寻找一种机制,通过该机制可以在存储在数十万个任务中的任务之间切换,但是许多Web工作人员等于计算机上的总内核,而又不会丢失这些任务中的状态

您将需要让每个当前运行的webWorker合作,并允许处理来自外界的消息,以便他们可以看到外界何时希望他们停止做更多的工作,然后让他们合作不呼叫下一个单位。工作,这样他们就不会做任何事情,直到下一条消息告诉他们重新开始工作。

如果您要拥有成千上万个这样的服务器,那么您可能不希望它们全部成为单独的webWorkers,因为这对系统来说有点沉重。您可能需要一组在工作队列上工作的webWorkers。您将要处理的工作单元排队,每个webWorker从队列中获取下一个工作单元,对其进行处理,然后获取下一个工作单元,依此类推。然后,您的主要过程只是使队列中充满了您希望webWorkers进行的任何工作。这还需要将工作分块为适当的工作单元。