Windows的Celery任务超时/时间限制?

时间:2013-06-10 21:02:40

标签: python windows signals celery

我有一个用Flask编写的网络应用程序,目前正在Windows上的IIS上运行(不要问......)。

我使用Celery处理一些异步处理(访问慢速数据库并生成报告)。

但是,在尝试设置错误处理的某些行为时,我在docs中遇到了这个问题:

  

"时间限制当前不适用于Windows和其他不支持SIGUSR1信号的平台。"

由于数据库可能变得非常慢,我真的希望能够为我的任务指定超时行为,并在数据库可能没有如此任务时让它们稍后重试。鉴于应用程序由于各种原因必须从Windows提供,是否有任何解决方法?

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

如果确实需要设置任务超时,可以使用子进程实现,代码如下

import json
from multiprocessing import Process
from celery import current_app
from celery.exceptions import SoftTimeLimitExceeded

soft_time_limit = 60

@current_app.task(name="task_name")
def task_worker(self, *args, **kwargs):
    def on_failure():
        pass
    worker = Process(target=do_working, args=args, kwargs=kwargs, name='worker')
    worker.daemon = True
    worker.start()
    worker.join(soft_time_limit)
    while worker.is_alive():
        worker.terminate()
        raise SoftTimeLimitExceeded  
    return json.dumps(dict(message="ok"))

def do_working(*args, **kwargs):
    pass # do something

答案 1 :(得分:0)

看起来Celery中没有任何内置的解决方法。您可以直接将此代码编入您的任务吗?换句话说,在您的python代码中,在开始任务时启动计时器,如果任务完成时间太长,引发异常,并再次将作业重新提交到队列。