Python中是否存在分布式任务队列,使我能够杀死不愿意合作的挂起任务

时间:2012-01-16 15:31:51

标签: python multithreading celery task-queue

基本上我有很多任务(大约1000个批次),这些任务的执行时间可能差别很大(从不到几秒到10分钟)。我知道如果一项任务执行超过一分钟我就可以杀死它。这些任务是优化某些数据挖掘模型的步骤(但彼此独立),并且大部分时间都在一些C扩展函数中,因此如果我试图优雅地杀死它们,它们就不会合作。

是否存在适合该架构的分布式任务队列--- AFAIK:celery允许中止愿意合作的任务。但我可能错了。

我最近提出了关于在纯python Kill hanging function in Python in multithreaded enviorment中杀死挂起函数的类似问题。

我想我可以将celery任务子类化,因此它会生成一个新进程,然后执行其有效负载,如果需要很长时间就会中止它的执行,但之后我会被初始化新解释器的开销所杀死。

3 个答案:

答案 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允许多个流程管理,包括杀死不合作的任务。

可是:

  • 它是测试版软件,即使它支持可靠的gunicorn
  • 我不知道它如何处理1000个进程
  • 尚未包含流程之间的通信,因此您必须自行设置,例如zeromq

另一种可能性是使用timer signal,因此它会在36000秒内引发异常。但是,如果有人获得了C程序可能会执行的GIL,那么信号就不会被歪曲。

答案 2 :(得分:0)

撤销芹菜任务时,您可以为其提供可选的terminate=True关键字。

task.revoke(terminate=True)

它并不完全符合您的要求,因为它不是由进程本身完成的,但是您应该能够扩展任务类以便能够自杀,或者有一个重复的清理任务或进程来终止任务没有准时完成。