用芹菜对特定任务设置时间限制

Posted

技术标签:

【中文标题】用芹菜对特定任务设置时间限制【英文标题】:Setting Time Limit on specific task with celery 【发布时间】:2012-07-25 05:02:01 【问题描述】:

我在 Celery 中有一个任务,它在正常运行时可能会运行 10,000 秒。然而,我的所有其他任务都应该在不到一秒的时间内完成。如何在不更改短期运行任务的时间限制的情况下为故意长时间运行的任务设置时间限制?

【问题讨论】:

【参考方案1】:

您可以在定义任务或调用时设置任务时间限制(hard 和/或soft)。

from celery.exceptions import SoftTimeLimitExceeded

@celery.task(time_limit=20)
def mytask():
    try:
        return do_work()
    except SoftTimeLimitExceeded:
        cleanup_in_a_hurry()

mytask.apply_async(args=[], kwargs=, time_limit=30, soft_time_limit=10)

【讨论】:

请注意,apply_async 的 timeout/soft_timeout 参数仅在 celery 的开发版本中可用(master 分支,未来版本 3.1) 您还可以使用以下命令为配置中的任务设置时间限制:CELERY_ANNOTATIONS = 'module.mytask': 'time_limit': 20.0 对于 celery 版本 3.1.x,看起来 timeout/soft_timeout 的参数 apply_async 也已更改为 time_limit/soft_time_limit。这里介绍了相关的变化——github.com/celery/celery/commit/… 添加到@sanchitarora 评论,来自 3.1.20 文档的链接 - docs.celeryproject.org/en/latest/userguide/…【参考方案2】:

这是一个使用 soft_time_limit=10000

的特定任务和 Celery 3.1.23 的装饰器示例
@task(bind=True, default_retry_delay=30, max_retries=3, soft_time_limit=10000)
def process_task(self, task_instance):
   """Task processing."""
        pass

【讨论】:

你也可以像@task(soft_time_limit=10, time_limit=15)一样将time_limit分配在一起

以上是关于用芹菜对特定任务设置时间限制的主要内容,如果未能解决你的问题,请参考以下文章

Celery Beat:一次限制为单个任务实例

有没有办法非暴力地停止芹菜工人的特定任务?

django/celery - 芹菜状态:错误:在时间限制内没有节点回复

芹菜:在特定时间间隔后执行任务

芹菜任务不会在 django 中执行

ExecutorService - 以特定时间限制执行每个任务