优雅的 python joblib 杀死

问题描述 投票:0回答:2

是否可以优雅地终止 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
    不为空)
  • ,则会挂起

有没有办法解决库来做到这一点?

python joblib
2个回答
0
投票

据我所知,Joblib不提供杀死生成线程的方法。 由于每个子线程都在自己的上下文中运行,因此实际上很难执行优雅的终止或终止。 话虽这么说,有一个可以采用的解决方法。

模仿

.join()
(线程)功能(某种):

  1. 创建一个共享内存

    shared_dict
    ,其中键对应于每个线程ID,值如果包含线程输出或异常,例如:

    shared_dict = {i: 对于范围内的 i 无 (num_workers)}

  2. 每当在任何线程中引发错误时,请通过处理程序捕获异常,而不是立即引发它,而是将其存储在共享内存标志中

  3. 创建一个等待

    all(shared_dict.values())

    的异常处理程序
  4. 在所有值都填充结果或错误后,通过引发错误或记录或其他方式退出程序。


0
投票

使用 Joblib 和 Loki 后端,你可以做到这一点:

from joblib.externals.loky import get_reusable_executor
get_reusable_executor().shutdown(wait=True)

或者您可以等待 5 分钟,泳池会自行关闭。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.