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