Gracefull python joblib kill

时间:2017-03-09 17:51:18

标签: python 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不为空)

有没有办法解决lib这样做?

1 个答案:

答案 0 :(得分:0)

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

模仿 .join()(线程)功能(种类):

  1. 创建一个共享内存shared_dict,键对应每个线程id,值如果包含线程输出或异常,例如:

    shared_dict = {i: None for i in range(num_workers)}

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

  3. 创建一个等待 all(shared_dict.values())

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