我有一个任务,从API中提取数据,然后对数据库(SQLite)进行系统自动化(删除,重命名......)。我将任务设置为每5分钟执行一次。但是,有时这项任务需要5分钟才能完成,因此两项任务并行运行。这不好,因为SQLite数据库在0分钟内被锁定到任务。我该如何防止相同的任务在另一个上执行?
怎样才可以有,要么,
- 任务不会,除非前面的任务已经完成或执行
- 第二个任务排队等候和执行后直接0分钟任务完成了吗?
我试图使用全局布尔值来防止任务在运行时执行,像这样。
automate_is_running = False
@periodic_task(run_every=timedelta(minutes=5))
def automate():
if not automate_is_running:
automate_is_running = True
automate_all()
automate_is_running = False
但是,返回UnboundLocalError: local variable 'automate_is_running' referenced before assignment
错误。我该怎么办?
那么首先,你必须在函数中使用'global'。但是,这仍然不能按需要工作,因为每个Celery工作人员都是自己的进程,数据不会在进程之间共享。您需要使用某种外部互斥锁,例如磁盘上的文件或db中的条目。 –
或者您可能只有一个工作人员一次只运行一项任务,或者甚至为每项任务设置一个时间限制。请参阅此处的配置:http://docs.celeryproject.org/en/latest/userguide/configuration.html –