Django定时任务框架django-apscheduler的使用

1.安装库

pip install django-apscheduler

2.添加 install_app    

django_apscheduler

3.在app下添加一个task.py文件,用来实现具体的定时任务

task.py

def my_scheduled_job():
    print("这个任务每3秒执行一次", time.time())

4.在app下创建一个management文件夹,里面包含一个空的__init__.py和一个文件夹commands,commands里面包含一个空的__init__.py和一个start_tasks.py,其中start_tasks.py是主要的启动脚本,结构如下:


from datetime import datetime
from apscheduler.executors.pool import ThreadPoolExecutor
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.triggers.cron import CronTrigger
from apscheduler.triggers.date import DateTrigger
from apscheduler.triggers.interval import IntervalTrigger
from django.core.management.base import BaseCommand
from django_apscheduler.jobstores import DjangoJobStore

from ...tasks import my_scheduled_job, my_scheduled_job1


#
# Django manage.py命令:存储定时任务信息
#
class Command(BaseCommand):
    help = '启动定时任务.'

    def handle(self, *args, **options):
        # 调度器
        scheduler = BlockingScheduler()  # 研发阶段使用
        # scheduler = BackgroundScheduler() # 生产阶段使用

        # 任务存储
        scheduler.add_jobstore(DjangoJobStore(), 'default')

        # 配置线程池执行器,限制最大并发数为1,防止并发
        executor = ThreadPoolExecutor(max_workers=1)
        scheduler.executor = executor

        # 注册定义任务
        id_print_task = 'print_task__job'
        print('开始-增加任务({})'.format(id_print_task))
        scheduler.add_job(
            my_scheduled_job,
            id=id_print_task,
            name=id_print_task,
            max_instances=1,
            replace_existing=True,
            trigger=IntervalTrigger(seconds=15, start_date=datetime.now(), ),  # 从当前时间开始,每15秒钟调度一次
        )

        # 指定某个时间运行
        run_date = datetime(2024, 7, 18, 18, 33)
        scheduler.add_job(
            my_scheduled_job1,
            id='id_print_task1',
            name='id_print_task1',
            trigger=DateTrigger(run_date=run_date),  # 使用 DateTrigger 并设置 run_date
            replace_existing=True  # 如果已存在同名任务,则替换它
        )

        # 指定每天某个时间运行
        scheduler.add_job(
            my_scheduled_job1,
            id='daily_task_at_18_36',
            name='Daily Task at 18:36',
            trigger=CronTrigger(hour=18, minute=38),  # 使用 CronTrigger 并设置小时和分钟
            replace_existing=True  # 如果已存在同名任务,则替换它
        )
        print('完成-增加任务({})'.format(id_print_task))

        # 启动定时任务
        try:
            scheduler.start()
        except KeyboardInterrupt:
            scheduler.shutdown()

5.修改settings.py配置,将时区改为中国,最主要是把USE两项注释掉,否则后面的定时任务的时间会晚八小时!!!!

settings.py

LANGUAGE_CODE = 'zh-hans'  # 中文语言代码

TIME_ZONE = 'Asia/Shanghai'  # 中国上海时区

# USE_I18N = True
#
# USE_TZ = True

6.添加完成后,做数据库迁移,会生成 表django_apscheduler_djangojob 和 表django_apscheduler_djangojobexecution

python manage.py migrate

7.启动项目,然后启动定时任务:

 python manage.py start_tasks

启动后,任务开始执行,数据库上述两张表会有数据进去,定时任务完成,其他的见后面拓展。

拓展:

django-apscheduler框架还提供了很多操作定时任务的函数。比如:

  • 删除任务
    scheduler.remove_job(job_name)
  • 暂停任务
    scheduler.pause_job(job_name)
  • 开启任务
    scheduler.resume_job(job_name)
  • 获取所有任务
    scheduler.get_jobs()
  • 修改任务
    scheduler.modify_job(job_name)

注:修改任务只能修改参数,如果要修改执行时间的话,有3种方法
第一就把任务删了重新创建,
第二直接操作数据库,
第三用到下面重设任务。

  • 重设任务
    scheduler.reschedule_job(job_name)

scheduler.reschedule_job(job_id="job1", trigger='interval', minutes=1)

相关推荐

  1. Django 使用Apscheduler执行定时任务

    2024-07-19 08:10:02       25 阅读
  2. flask_apscheduler 定时任务框架

    2024-07-19 08:10:02       33 阅读
  3. django 定时任务创建

    2024-07-19 08:10:02       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 08:10:02       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 08:10:02       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 08:10:02       57 阅读
  4. Python语言-面向对象

    2024-07-19 08:10:02       68 阅读

热门阅读

  1. Python 3 CGI编程

    2024-07-19 08:10:02       18 阅读
  2. 为什么 HashMap 的容量是 2 的整次幂?

    2024-07-19 08:10:02       15 阅读
  3. C++编程逻辑讲解step by step:利用文档类处理数据

    2024-07-19 08:10:02       20 阅读
  4. 【Oracle】Oracle中的LISTAGG函数

    2024-07-19 08:10:02       18 阅读
  5. new和malloc

    2024-07-19 08:10:02       21 阅读
  6. Redis 地理位置 GEO 模块

    2024-07-19 08:10:02       21 阅读
  7. 一文理解ThreadPoolExecutor线程池以及运行时间

    2024-07-19 08:10:02       20 阅读
  8. AccessibilityEvent常用事件

    2024-07-19 08:10:02       19 阅读
  9. vue3封装el-table及实现表头自定义筛选

    2024-07-19 08:10:02       19 阅读
  10. jEasyUI 显示海量数据

    2024-07-19 08:10:02       19 阅读