我有一个用Flask编写的网络应用程序,目前正在Windows上的IIS上运行(不要问......)。
我使用Celery处理一些异步处理(访问慢速数据库并生成报告)。
但是,在尝试设置错误处理的某些行为时,我在docs中遇到了这个问题:
"时间限制当前不适用于Windows和其他不支持SIGUSR1信号的平台。"
由于数据库可能变得非常慢,我真的希望能够为我的任务指定超时行为,并在数据库可能没有如此任务时让它们稍后重试。鉴于应用程序由于各种原因必须从Windows提供,是否有任何解决方法?
非常感谢你的帮助。
答案 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代码中,在开始任务时启动计时器,如果任务完成时间太长,引发异常,并再次将作业重新提交到队列。