基本上我有很多任务(大约1000个批次),这些任务的执行时间可能差别很大(从不到几秒到10分钟)。我知道如果一项任务执行超过一分钟我就可以杀死它。这些任务是优化某些数据挖掘模型的步骤(但彼此独立),并且大部分时间都在一些C扩展函数中,因此如果我试图优雅地杀死它们,它们就不会合作。
是否存在适合该架构的分布式任务队列--- AFAIK:celery允许中止愿意合作的任务。但我可能错了。
我最近提出了关于在纯python Kill hanging function in Python in multithreaded enviorment中杀死挂起函数的类似问题。
我想我可以将celery任务子类化,因此它会生成一个新进程,然后执行其有效负载,如果需要很长时间就会中止它的执行,但之后我会被初始化新解释器的开销所杀死。
答案 0 :(得分:6)
Celery支持time limiting。您可以使用时间限制来终止长时间运行的任务。除了执行任务之外,您还可以使用 soft 限制,这些限制可以处理任务中的 SoftTimeLimitExceeded 异常并彻底终止任务。
from celery.task import task
from celery.exceptions import SoftTimeLimitExceeded
@task
def mytask():
try:
do_work()
except SoftTimeLimitExceeded:
clean_up_in_a_hurry()
答案 1 :(得分:0)
Pistil允许多个流程管理,包括杀死不合作的任务。
可是:
另一种可能性是使用timer signal,因此它会在36000秒内引发异常。但是,如果有人获得了C程序可能会执行的GIL,那么信号就不会被歪曲。
答案 2 :(得分:0)
撤销芹菜任务时,您可以为其提供可选的terminate=True
关键字。
task.revoke(terminate=True)
它并不完全符合您的要求,因为它不是由进程本身完成的,但是您应该能够扩展任务类以便能够自杀,或者有一个重复的清理任务或进程来终止任务没有准时完成。