是否可以优雅地终止 joblib进程(线程后端),并仍然返回到目前为止的计算结果?
parallel = Parallel(n_jobs=4, backend="threading")
result = parallel(delayed(dummy_f)(x) for x in range(100))
Run Code Online (Sandbox Code Playgroud)
目前我想出了两个解决方案
parallel._aborted = True 等待开始的工作完成(在我的情况下它可能很长)parallel._terminate_backend()如果作业仍在管道中(parallel._jobs非空),则挂起有没有办法解决 lib 来做到这一点?
小智 0
据我所知,Joblib没有提供杀死生成线程的方法。由于每个子线程都在自己的上下文中运行,因此实际上很难执行优雅的终止或终止。话虽这么说,有一个可以采用的解决方法。
模仿.join()(线程)功能(某种):
创建一个共享内存shared_dict,其中键对应于每个线程 ID,值如果包含线程输出或异常,例如:
Shared_dict = {i: 对于范围内的 i 无 (num_workers)}
每当在任何线程中引发错误时,通过处理程序捕获异常,而不是立即引发它,而是将其存储在共享内存标志中
创建一个等待的异常处理程序all(shared_dict.values())
在所有值都填充结果或错误后,通过引发错误或记录或其他方式退出程序。