Django定时任务之django_apscheduler使用

Django定时任务之django_apscheduler使用

今天在写一个任务需求时需要用到定时任务来做一部分数据处理与优化,于是在了解完现有方法,结合自己需求决定使用django_apscheduler,记录一下过程,有几篇值得参考的文章放在结尾,很多本文未提到之处可详见参考文章。
1、安装插件

bash 复制代码
pip install django-crontab

2、添加至settings中

bash 复制代码
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_apscheduler', # 这里
    ...
]

3、migrate一下

bash 复制代码
python manage.py migrate

会多出两个表,记录定时任务及执行

4、写定时任务,可以直接写在已有app的views.py文件中,也可以自己新建一个app,放在新建app的views.py文件中,不过有一点需要注意,就是views.py文件得在api中引用才行,否则定时任务无法执行

1)若是写在已有app的views.py文件中,可以直接复制以下代码进行测试

python 复制代码
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore, register_job

# 实例化调度器
scheduler = BackgroundScheduler(timezone='Asia/Shanghai')
# 调度器使用DjangoJobStore()
scheduler.add_jobstore(DjangoJobStore(), "default")

@register_job(scheduler, "interval", seconds=5, id="test_func", replace_existing=True, misfire_grace_time=120)
def test_func():
    print('test')

scheduler.start()

2)新建app,这里我新建了一个timedtasks的app,以下是view.py文件的内容,分别有三个job,可以供测试

python 复制代码
# Create your views here.

from django.http import HttpResponse
import time
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore, register_job, register_events

import logging
logger = logging.getLogger('apps')

# 实例化调度器
scheduler = BackgroundScheduler(timezone='Asia/Shanghai')
# 调度器使用DjangoJobStore()
scheduler.add_jobstore(DjangoJobStore(), "default")

logger.info('django-apscheduler')


# 1.通过 @register_job 类装饰器做法 每间隔5s执行一次
@register_job(scheduler, "interval", seconds=5, args=['job1name'], id='job1', replace_existing=True)
def job1(name):
    # 具体要执行的代码
    print('{} 任务运行成功!{}'.format(name, time.strftime("%Y-%m-%d %H:%M:%S")))

def job2(name):
    # 具体要执行的代码
    print('{} 任务运行成功!{}'.format(name, time.strftime("%Y-%m-%d %H:%M:%S")))

def job3(name):
    print('{} 任务运行成功!{}'.format(name, time.strftime("%Y-%m-%d %H:%M:%S")))

# 2.add_job的方式 interval 每间隔10s执行一次
scheduler.add_job(job2, "interval", seconds=10, args=['job2name'], id="job2", replace_existing=True)

# 3.add_job的方式 crontab 16点 38分/40分 执行
scheduler.add_job(job3, 'cron', hour='16', minute='38,40', args=['job3name'], id='job3', replace_existing=True)

# 监控任务
register_events(scheduler)
# 调度器开始运行
scheduler.start()


# 注:必须得注册到API中去才可以,不然定时任务不能注册,不能执行
def testTimedTasks(request):
    return HttpResponse('ok')

注意,urls.py文件中得引用:

python 复制代码
from apps.timedtasks.views import testTimedTasks
urlpatterns = [
	...,
    path("test-timed-tasks/", testTimedTasks, name="test-timed-tasks"),
]

简单记录一下流程,如有错误欢迎指正,如有补充欢迎评论!

【参考】https://blog.csdn.net/weixin_42782150/article/details/123212604

【参考】https://blog.csdn.net/hans99812345/article/details/123926503

【参考】https://www.cnblogs.com/leisunny/p/16185169.html

相关推荐
不再幻想,脚踏实地2 分钟前
Spring Boot配置文件
java·数据库·spring boot
_extraordinary_4 分钟前
MySQL 事务(二)
android·数据库·mysql
fmdpenny23 分钟前
SQL中联表的运用
数据库·sql
不剪发的Tony老师30 分钟前
互联网SQL面试题:用户会话时长分析
数据库·sql
睡觉z1 小时前
Shell编程之正则表达式与文本处理器
数据库·mysql·正则表达式
TDengine (老段)1 小时前
TDengine 做为 Spark 数据源
大数据·数据库·物联网·ajax·spark·时序数据库·tdengine
Dreams_l1 小时前
MySQL初阶:查询进阶
数据库·mysql
码农黛兮_461 小时前
数据库数据清洗、预处理与质量监控、 数据质量的核心概念
数据库
张哈大3 小时前
【 Redis | 实战篇 秒杀实现 】
数据库·redis·缓存
weixin_472339463 小时前
Postgresql与openguass对比
数据库·postgresql