8

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

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

但是,当尝试设置一些错误处理行为时,我在文档中遇到了这个问题:

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

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

非常感谢你的帮助。

4

2 回答 2

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
于 2018-05-23T03:29:20.203 回答
0

在 Celery 中似乎没有任何内置的解决方法。您能否将其直接编码到您的任务中?换句话说,在你的python代码中,当你开始任务时启动一个计时器,如果任务完成时间太长,引发异常,然后再次将作业重新提交到队列中。

于 2017-09-05T20:06:23.393 回答