django中使用定时任务执行某些操作时的规范操作

安装配置

pip install django-crontab

再在settings.py中添加app:

INSTALLED_APPS = (
       ...
       'django_crontab',
   )

开始创建定时任务

在app内新建一个py文件,我在这里新建一个util.py

def task():
   print('我会被每分钟执行一次,并且将内容输出到log文件中')

最简单配置 在你的settings中设置

CRONJOBS = [
    # 表示每过一分钟执行一次
    ('*/1 * * * *', 'base.utils.task','>> /tmp/testapi_crontab.log')
]
#后面的>> /tmp/testapi_crontab.log' 表示将定时执行的函数的打印结果输出到已经在本机中建立好的log文件中,方便调试。

解释

第一个参数(表示时间):
前5个字段分别表示:

分钟:0-59
小时:1-23
日期:1-31
月份:1-12
星期:0-6(0表示周日)
一些特殊符号:
*: 表示任何时刻
,: 表示分割
-:表示一个段,如第二端里: 1-5,就表示1到5点
/n : 表示每个n的单位执行一次,如第二段里,*/1, 就表示每隔1个小时执行一次命令。也可以写成1-23/1.

第二个参数(表示路径):

格式:app名称/文件名/函数名

如果想生成日志,那就再加一个字符串类型的参数:’>> path/name.log’, path路径,name文件名。’>>’表示追加写入,’>’表示覆盖写入。

提示:如果你有多个定时任务,以逗号隔开,都放入CORJOBS中即可。

启动任务

以上都完成后,需要执行
将任务添加并生效

python manage.py crontab add

显示当前的定时任务

python manage.py crontab show

删除所有定时任务

python manage.py crontab remove
最后重启django服务
python manage.py runserver
### 实现Django中的定时任务 #### 使用`django-crontab` 在Django中,可以借助于`django-crontab`这个第三方库来轻松地实现定时任务功能。为了使该特性生效,需先安装此包并将其加入项目的依赖列表中。 对于配置方面,在项目的设置文件内指定具体的cron表达式以及对应的Python函数路径[^2]。例如: ```python CRONJOBS = [ ('*/1 * * * *', 'myapp.cron.my_scheduled_job') ] ``` 上述例子表示每隔一分钟就会触发一次位于`myapp/cron.py`模块下的`my_scheduled_job()`函数调用。 要让这些设定真正起作用,则需要执行特定的管理命令以注册或取消注册已定义好的crontab条目: - 注册新任务:`python manage.py crontab add` - 移除现有任务:`python manage.py crontab remove` 值得注意的是,当涉及到含有非ASCII字符的数据处理,可能遇到编码问题;对此可以在部署环境中调整环境变量或者修改shell脚本的方式加以解决。 #### 利用Celery与APScheduler组合方案 另一种更为灵活的选择是采用Celery配合APScheduler的方式来构建更加复杂的调度逻辑。首先得确保已经按照官方文档说明完成了必要的初始化工作——即创建celery实例并与Django项目相连接[^3]。 接着引入APScheduler组件负责实际的任务规划职责,并通过Redis提供分布式锁机制防止多节点环境下可能出现的竞争条件[^4]。下面给出一段简化版代码片段展示如何结合两者优势快速搭建一套稳定高效的后台作业管理系统: ```python from apscheduler.schedulers.background import BackgroundScheduler from apscheduler.triggers.interval import IntervalTrigger import redis_lock def scheduled_task(): with redis_lock.Lock(redis_client, "unique-task-key"): # 执行具体业务操作... pass scheduler = BackgroundScheduler() trigger = IntervalTrigger(seconds=15) job = scheduler.add_job(scheduled_task, trigger) if __name__ == '__main__': try: scheduler.start() while True: time.sleep(2 ** 31 - 1) # Long sleep to keep main thread alive. except (KeyboardInterrupt, SystemExit): scheduler.shutdown(wait=False) ``` 这段程序会在每次间隔十五秒后尝试获取名为"unique-task-key"的独占型锁对象,只有成功获得者才能继续往下走从而避免重复计算的风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haeasringnar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值