Python中是否有分布式任务队列使我能够终止不愿意合作的挂起任务

2024-03-29 05:48:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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

是否有一个符合这种模式的分布式任务队列——AFAIK:celery允许中止愿意合作的任务。但我可能错了。在

我最近问了一个类似的问题,关于在纯pythonKill hanging function in Python in multithreaded enviorment中杀死挂起函数。在

我想我可以将celery任务子类化,这样它会产生一个新的进程,然后执行它的有效负载,如果需要很长的时间,它就会中止它的执行,但这样一来,新解释器的初始化开销会让我丧命。在


Tags: 函数in模型数据挖掘队列时间模式分布式
3条回答

当您撤消芹菜任务时,可以为它提供可选的terminate=True关键字。在

task.revoke(terminate=True)

它并不完全符合您的需求,因为它不是由进程本身完成的,但是您应该能够扩展task类以使其能够自杀,或者重新执行清理任务或进程终止未按时完成的任务。在

Celery支持time limiting。您可以使用时间限制来终止长时间运行的任务。除了终止任务外,您还可以使用限制来处理任务中的softTimelimitheded异常并干净地终止任务。在

from celery.task import task
from celery.exceptions import SoftTimeLimitExceeded

@task
def mytask():
    try:
        do_work()
    except SoftTimeLimitExceeded:
        clean_up_in_a_hurry()

Pistil允许多个进程管理,包括终止不合作的任务。在

但是:

  • 这是测试版软件,即使它能为gunicorn提供可靠的动力
  • 我不知道它是如何处理1000个进程的
  • 进程之间的通信还没有包括在内,所以您必须使用例如zeromq来设置自己的进程

另一种可能是使用timer signal,因此它在36000秒内引发异常。但是如果有人获得了GIL,信号就不会被触发,你的C程序可能会这样做。在

相关问题 更多 >