我一直在使用Django开发网络应用程序,并且很好奇是否有一种方法可以安排作业定期运行。
基本上,我只是想遍历数据库并定期自动进行一些计算/更新,但是我似乎找不到任何有关此操作的文档。
有人知道如何设置吗?
需要说明的是:我知道我可以设置cron
作业来执行此操作,但是我很好奇Django中是否有某些功能可以提供此功能。 我希望人们能够自己部署此应用程序,而无需进行大量配置(最好为零)。
我已经考虑过通过简单地检查自从上次将请求发送到站点以来是否应该运行作业来“追溯地”触发这些操作,但是我希望有一些清洁的方法。
#1楼
Celery是基于AMQP(RabbitMQ)构建的分布式任务队列。 它还以cron类的方式处理周期性任务(请参阅周期性任务 )。 根据您的应用程序,可能值得一试。
用django( docs )设置Celery非常容易,并且在停机的情况下,定期任务实际上会跳过错过的任务。 如果任务失败,Celery还具有内置的重试机制。
#2楼
将以下内容放在cron.py文件的顶部:
#!/usr/bin/python
import os, sys
sys.path.append('/path/to/') # the parent directory of the project
sys.path.append('/path/to/project') # these lines only needed if not on path
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproj.settings'
# imports and code below
#3楼
是的,上面的方法很棒。 我尝试了其中一些。 最后,我发现了这样的方法:
from threading import Timer
def sync():
do something...
sync_timer = Timer(self.interval, sync, ())
sync_timer.start()
就像递归一样。
好的,我希望这种方法可以满足您的要求。 :)
#4楼
我用芹菜做我的定期任务。 首先,您需要按以下步骤安装它:
pip install django-celery
不要忘记在您的设置中注册django-celery
,然后您可以执行以下操作:
from celery import task
from celery.decorators import periodic_task
from celery.task.schedules import crontab
from celery.utils.log import get_task_logger
@periodic_task(run_every=crontab(minute="0", hour="23"))
def do_every_midnight():
#your code
#5楼
尽管不是Django的一部分,但Airflow是一个较新的项目(截至2016年),对任务管理很有用。
Airflow是一个工作流自动化和调度系统,可用于创作和管理数据管道。 基于Web的UI为开发人员提供了一系列用于管理和查看这些管道的选项。
Airflow用Python编写,并使用Flask构建。
Airflow由Airbnb的Maxime Beauchemin创建,并于2015年春季开源。它于2016年冬季加入Apache Software Foundation的孵化计划。这是Git项目页面和一些其他背景信息 。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3159621