优雅地终止Python Joblib任务

10

是否有可能优雅地终止一个使用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 不为空)

是否有一种方法可以绕过库来实现这个目标?


你能为你的每个解决方案举一个例子吗? - Alex Ramses
好的,我会尝试花些时间记录这个。很抱歉回复晚了 :) - sknat
这个回答解决了你的问题吗?Joblib Parallel无法终止进程 - undefined
1个回答

0
据我所知,Joblib没有提供杀死生成的线程的方法。由于每个子线程在自己的上下文中运行,因此实际上很难进行优雅的终止或结束。话虽如此,有一个可以采用的解决方法。
模拟线程的.join()功能(有点像):
1.创建一个共享内存shared_dict,其中键对应于每个线程ID,值包含线程输出或异常,例如:

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

2.每当任何线程引发错误时,通过处理程序捕获异常,并将其存储在共享内存标志中,而不是立即引发它。
3.创建一个异常处理程序,等待all(shared_dict.values()) 4.在所有值都填充了结果或错误后,通过引发错误或记录或其他方式退出程序。

嗨,谢谢你的回复! 没错,据我所知joblib已经有了类似的行为,将结果存储在共享映射中,并在完成时返回。 我的问题是希望在线程完成之前停止它们。joblib提供的API没有(没有?)允许这样做,除非黑客攻击私人功能。 最终我破解了它以使其工作,但我仍然需要花时间记录它。 - sknat
嗨,你说得对,它应该是这样工作的,但在UWSGI应用程序部署环境中,Joblib可能会搞砸事情。我遇到了这个问题,因为多个错误处理程序堆叠在一起。在我的情况下,当任何工作进程引发错误时,它会引发端点错误,但由于错误是在Joblib等待其他进程完成之前引发的,它只会暂停剩余的工作进程,并在下一个请求到来时恢复它们,这会因为在先前的请求中进行的清理而引发奇怪的运行时错误。 - Rishav Dutta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接