• Django定时任务之django_apscheduler使用


    Django定时任务之django_apscheduler使用

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

    pip install django-crontab
    
    • 1

    2、添加至settings中

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'django_apscheduler', # 这里
        ...
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3、migrate一下

    python manage.py migrate
    
    • 1

    会多出两个表,记录定时任务及执行
    在这里插入图片描述
    4、写定时任务,可以直接写在已有app的views.py文件中,也可以自己新建一个app,放在新建app的views.py文件中,不过有一点需要注意,就是views.py文件得在api中引用才行,否则定时任务无法执行
    1)若是写在已有app的views.py文件中,可以直接复制以下代码进行测试

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

    # 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')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

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

    from apps.timedtasks.views import testTimedTasks
    urlpatterns = [
    	...,
        path("test-timed-tasks/", testTimedTasks, name="test-timed-tasks"),
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    【参考】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

  • 相关阅读:
    CentOS 搭建k8s
    shell编程规范与变量
    负号重载C++
    Visual Studio(VS)C++项目 管理第三方依赖库和目录设置
    Seata入门系列【8】Seata之AT模式执行流程解析
    单图像超分辨率重建总结
    单反相机用sd卡还是cf卡?相机cf卡和sd卡区别
    【Qt】QxOrm下载、编译、使用
    ORB-SLAM2 ---- Initializer::ReconstructF函数
    You may use special comments to disable some warnings
  • 原文地址:https://blog.csdn.net/hhhmonkey/article/details/136211346