Django Celery:仅执行长时间运行的进程的一个实例

2024-01-04

我有一个长时间运行的进程,必须每五分钟运行一次,但进程的多个实例不应同时运行。该过程通常不应运行超过五分钟,但我想确保第二个实例如果运行超过则不会启动。

Per a 之前的推荐 https://stackoverflow.com/questions/8718642/preventing-management-commands-from-running-more-than-one-at-a-time/8718832#comment10856387_8718832,我正在使用 Django Celery 来安排这个长时间运行的任务。

我认为定期任务不起作用,因为如果我有五分钟的时间段,如果该任务的另一个实例已经在运行,我不希望执行第二个任务。

我当前的实验是这样的:8点55分,任务实例开始运行。当任务完成时,它将触发其自身的另一个实例在接下来的五分钟标记处运行。因此,如果第一个任务在 8:57 完成,第二个任务将在 9:00 运行。如果第一个任务恰好运行很长时间并在 9:01 完成,它将安排下一个实例在 9:05 运行。

在执行除下面的简单示例之外的任何操作时,我一直在与各种神秘错误作斗争,而且我还没有找到任何其他人从其先前实例中安排任务的示例。我想知道是否有更好的方法来完成我想做的事情。我知道有一种方法可以命名一个人的任务;也许有一种方法可以搜索具有相同名称的正在运行或计划的实例?对于每五分钟运行一项任务,但确保一次只运行一项任务,有人有什么建议吗?

谢谢你, 乔

在 mymodule/tasks.py 中:

import datetime
from celery.decorators import task 

@task 
def test(run_periodically, frequency):

    run_long_process()
    now = datetime.datetime.now()
    # Run this task every x minutes, where x is an integer specified by frequency
    eta = (
      now - datetime.timedelta(
         minutes =  now.minute % frequency , seconds = now.second, 
         microseconds = now.microsecond ) ) + datetime.timedelta(minutes=frequency) 
    task = test.apply_async(args=[run_periodically, frequency,], eta=eta)  

从 ./manage.py shell:

from mymodule import tasks
result = tasks.test.apply_async(args=[True, 5])

您可以使用与特殊锁配对的周期性任务,以确保一次执行一个任务。以下是 Celery 文档中的示例实现:

http://ask.github.com/celery/cookbook/tasks.html#ensuring-a-task-is-only-execulated-one-at-a-time http://ask.github.com/celery/cookbook/tasks.html#ensuring-a-task-is-only-executed-one-at-a-time

如果其中一个任务失败,您所描述的从上一次执行中调度任务的方法可以停止任务的执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django Celery:仅执行长时间运行的进程的一个实例 的相关文章

随机推荐