是否有可能优雅地杀死一个joblib https://github.com/joblib/joblib处理(线程后端),并且仍然返回到目前为止的计算结果?
parallel = Parallel(n_jobs=4, backend="threading")
result = parallel(delayed(dummy_f)(x) for x in range(100))
目前我想出了两个解决方案
-
parallel._aborted = True
等待已启动的作业完成(在我的情况下可能会很长)
-
parallel._terminate_backend()
如果作业仍在管道中(parallel._jobs
不是空的)
有没有办法解决库来做到这一点?
据我所知,Joblib不提供杀死生成线程的方法。
由于每个子线程都在自己的上下文中运行,因此实际上很难执行优雅的终止或终止。
话虽这么说,有一个可以采用的解决方法。
Mimic .join()
(线程的)功能(kind of):
-
创建共享内存shared_dict
键对应于每个线程 ID,值如果包含线程输出或异常,例如:
Shared_dict = {i: 对于范围内的 i 无 (num_workers)}
-
每当在任何线程中引发错误时,通过处理程序捕获异常,而不是立即引发它,而是将其存储在共享内存标志中
-
创建一个等待的异常处理程序all(shared_dict.values())
-
在所有值都填充结果或错误后,通过引发错误或记录或其他方式退出程序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)