完成后是否需要终止/关闭/删除网络工作者?
Do I need to terminate / close / delete a web worker when i'm done with it?
我有一个使用网络工作者清理 indexedDB 数据库的应用程序。我设置了它,所以它可以从全局函数调用启动,如果在完成之前再次调用该函数,它不会重新启动,但如果在完成后调用该函数,它会通过创建一个新实例重新启动工人的。这方面对我来说都很好。
我是否需要在工作完成后以任何方式删除、销毁、终止旧的 worker 实例?
Do I need to delete, destroy, terminate the old instance of the worker in any sense after it's finished working?
在正常情况下,worker 会注册一个事件处理程序来侦听来自主脚本的消息,所以是的,如果您希望卸载 worker,您需要告诉它取消注册。您可以通过以下两种方式之一进行操作:
- 向它发送一条消息,告诉它进行清理,并让工作人员通过注销所有事件处理程序来响应该消息。这让工作人员优雅地退出。
- 使用
Worker#terminate
,它会立即终止 worker,而不给它任何机会完成它正在做的事情。
如果 worker 没有监听消息,没有注册其他事件处理程序,也没有在循环中工作,则您不必执行任何特定操作(但这样做的可能性很小)低,工作人员几乎总是注册事件处理程序来收听消息)。
...but if the function is called after it's done it does restart, by creating a new instance of the worker.
我建议重新审视该设计。相反,创建工人一次,然后在每次需要它做某事时向它发送一条消息,而不是每次都重新创建整个事情。
我有一个使用网络工作者清理 indexedDB 数据库的应用程序。我设置了它,所以它可以从全局函数调用启动,如果在完成之前再次调用该函数,它不会重新启动,但如果在完成后调用该函数,它会通过创建一个新实例重新启动工人的。这方面对我来说都很好。
我是否需要在工作完成后以任何方式删除、销毁、终止旧的 worker 实例?
Do I need to delete, destroy, terminate the old instance of the worker in any sense after it's finished working?
在正常情况下,worker 会注册一个事件处理程序来侦听来自主脚本的消息,所以是的,如果您希望卸载 worker,您需要告诉它取消注册。您可以通过以下两种方式之一进行操作:
- 向它发送一条消息,告诉它进行清理,并让工作人员通过注销所有事件处理程序来响应该消息。这让工作人员优雅地退出。
- 使用
Worker#terminate
,它会立即终止 worker,而不给它任何机会完成它正在做的事情。
如果 worker 没有监听消息,没有注册其他事件处理程序,也没有在循环中工作,则您不必执行任何特定操作(但这样做的可能性很小)低,工作人员几乎总是注册事件处理程序来收听消息)。
...but if the function is called after it's done it does restart, by creating a new instance of the worker.
我建议重新审视该设计。相反,创建工人一次,然后在每次需要它做某事时向它发送一条消息,而不是每次都重新创建整个事情。