APScheduler、Django、Python实现定时任务,以及任务操作

环境:Windows 11、python 3.12.3、Django 4.2.11、 APScheduler 3.10.4

背景:工作需要使用且用法较为复杂,各种功能基本都使用了

事件:20240920

说明:记录,方便后期自己查找

 1、搭建基础环境

文件结构图

蓝色代表文件,黑色代表目录,主要是django自动生成的文件以及apscheduler需要的文件

包括Django、APScheduler两个,代码如下:

新建scheduler文件

创建调度器,并配置启动函数

# scheduleJob\scheduler.pyfrom apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor
from django_apscheduler.jobstores import DjangoJobStore
from pytz import timezone, utc# 第二种方式,内嵌
jobstores = {"default": DjangoJobStore()}
executors = {"default": ThreadPoolExecutor(20), "processpool": ProcessPoolExecutor(5)}
job_defaults = {                    # 该参数既可以在创建scheduler对象时使用,也可以用在add_job中,对象范围广、优先级低'coalesce': True,               # 是否合并积压的任务。如果设置为 True,当任务运行时间落后时,会只运行一次,而不是运行多次。默认值为 False。'max_instances': 2,             # 允许的最大作业实例数。确保同一任务在同一时间不会有多个实例运行。默认值为 1。'misfire_grace_time': 30,       # 设置任务错过其执行时间的容忍时间(以秒为单位)。如果任务在这个时间内错过了执行时间,将立即执行。如果设置为 None,则没有时间限制。'replace_existing': True        # 如果添加的任务ID已存在,是否替换现有任务。默认值为 False。
}
scheduler = BackgroundScheduler(jobstores=jobstores, executors=executors, job_defaults=job_defaults, timezone=timezone('Asia/Shanghai'))def start():scheduler.start()

 在settings文件中添加应用并配置数据库

# scheduleJob\settings.pyINSTALLED_APPS = [# ...'django_apscheduler','testapscheduler',
]
ROOT_URLCONF = 'scheduleJob.urls'
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': "scheduler",'USER': "root",'PASSWORD': "123456",'HOST': "localhost",'PORT': 3306,}
}
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_TZ = False

 在apps中实现启动调度器

# testapscheduler\apps.pyfrom django.apps import AppConfigclass TestapschedulerConfig(AppConfig):default_auto_field = 'django.db.models.BigAutoField'name = 'testapscheduler'print("启动")def ready(self):from scheduleJob import schedulerscheduler.start()

 在url中配置路由

# scheduleJob\urls.pyfrom django.contrib import admin
from django.urls import path
from testapscheduler.views import operate_taskurlpatterns = [path('admin/', admin.site.urls),path('operate_task/', operate_task),
]

 在views文件中实现真正的逻辑处理

# testapscheduler\views.pyfrom scheduleJob.scheduler import scheduler
from django.http import HttpResponse
from datetime import datetime
from django.views.decorators.csrf import csrf_exemptimport time, json# Create your views here.
@csrf_exemptdef operate_task(request):# 动态任务id, 利用时间戳获取整数,如一秒内添加两个,则会出现bugp = request.POST.get("id")print(p, "============")my_task_id = int(datetime.timestamp(datetime.now()))# job参数job_kwargs = {"func":excute_task,                     # job的函数"id":str(my_task_id),                   # 添加的jobid, 必须是字符串"name":f"task_{my_task_id}",            # 添加的job名称"kwargs":{"info":"test"},               # job的函数参数,本例中excute_task需要的参数"next_run_time": datetime.now(),        # 添加任务成功后立即执行"replace_existing": True,               "misfire_grace_time": 10,               "coalesce": True,                       "max_instances": 10,                    "trigger": "interval",                  # 任务执行类型,还有date、cron"seconds": 10,                          # 任务执行间隔时间,代表每10s执行一次}scheduler.add_job(**job_kwargs)# scheduler.remove_all_jobs()return HttpResponse("add task success")def excute_task(info):time.sleep(3)print(info, "--------------------------------", datetime.now())

数据库迁移 

运行前,先执行数据库迁移

python manage.py makemigrationspython manage.py migrate# 前者是将model层转为迁移文件migration
# 后者将新版本的迁移文件执行,更新数据库。

 会在数据库生成两个表,引用方法如下

from django_apscheduler.models import DjangoJob, DjangoJobExecution

django_apscheduler_djangojob:对应Django中的DjangoJob,共计三个字段,分别为id、next_run_time、job_state,默认排序字段为next_run_time

django_apscheduler_djangojobexecution:对应Django中的DjangoJobExecution,共计八个字段,分别是id、status、run_time、duration、finished、exception、traceback、job_id。

postman请求测试

在postman中请求路由,代码如下:

# postman生成的请求代码import requests
import jsonurl = "localhost:8000/operate_task/"payload = json.dumps({"action": "start","id": 1
})
headers = {'Content-Type': 'application/json'
}response = requests.request("POST", url, headers=headers, data=payload)print(response.text)

实现效果

test -------------------------------- 2024-09-20 15:13:58.165250
test -------------------------------- 2024-09-20 15:13:58.165250
test -------------------------------- 2024-09-20 15:14:04.469140
test -------------------------------- 2024-09-20 15:14:04.469140

任务状态

#: constant indicating a scheduler's stopped state
STATE_STOPPED = 0
#: constant indicating a scheduler's running state (started and processing jobs)
STATE_RUNNING = 1
#: constant indicating a scheduler's paused state (started but not processing jobs)
STATE_PAUSED = 2

2、调度器动态操作

1、查询所有任务

# testapscheduler\views.py# ......@csrf_exempt
def query_all_task(request):# 查看所有任务job_list = scheduler.get_jobs()return JsonResponse([{x.name:x.id} for x in job_list], safe=False)

响应

[{"task_1726812545": "1726812545"},{"task_1726816011": "1726816011"}
]

2、查询某个任务

 

@csrf_exempt
def get_job(request):# 查询任务是否存在job_id = loads(request.body).get("id")msg = scheduler.get_job(job_id=job_id)print(msg)return JsonResponse({"msg":"success"})

 3、移除所有任务

@csrf_exempt
def remove_all_jobs(request):# 移除所有任务, 事件代码是256scheduler.remove_all_jobs()return JsonResponse({"msg":"success"})

4、移除某个任务

@csrf_exempt
def remove_job(request):# 移除某个任务, 事件代码是1024job_id = loads(request.body).get("id")scheduler.remove_job(job_id=job_id)return JsonResponse({"msg":"success"})

5、暂停某个任务

@csrf_exempt
def pause_job(request):# 暂停某个任务, 事件代码是2048job_id = loads(request.body).get("id")scheduler.pause_job(job_id=job_id)return JsonResponse({"msg":"success"})

6、恢复某个任务

@csrf_exempt
def resume_job(request):# 恢复某个任务,仅能恢复已暂停的任务, 事件代码是2048job_id = loads(request.body).get("id")scheduler.resume_job(job_id=job_id)return JsonResponse({"msg":"success"})

7、添加某个任务

@csrf_exempt
def add_job(request):# 添加任务, 事件代码是512kwargs = loads(request.body)scheduler.add_job(**kwargs)return JsonResponse({"msg":"success"})

8、修改某个任务

@csrf_exempt
def modify_job(request):# 恢复某个任务,仅能恢复已暂停的任务, 事件代码是2048job_id = loads(request.body).get("id")changes = loads(request.body).get("changes")scheduler.modify_job(job_id=job_id, changes=changes)return JsonResponse({"msg":"success"})

9、打印所有任务信息

@csrf_exempt
def print_jobs(request):# 打印所有任务信息scheduler.print_jobs()return JsonResponse({"msg":"success"})

10、启动调度器

@csrf_exempt
def start(request):# 调度程序关闭, 事件代码是1scheduler.start()return JsonResponse({"msg":"success"})

11、关闭调度器

@csrf_exempt
def shutdown(request):# 调度程序关闭, 事件代码是2scheduler.shutdown()return JsonResponse({"msg":"success"})

12、暂停调度器

@csrf_exempt
def pause(request):# 调度程序暂停, 事件代码是4scheduler.pause()return JsonResponse({"msg":"success"})

13、恢复调度器

@csrf_exempt
def resume(request):# 调度程序恢复, 事件代码是8scheduler.resume()return JsonResponse({"msg":"success"})

14、添加执行器

@csrf_exempt
def add_executor(request):# 调度程序添加执行器, 事件代码是16executors = {"default": ThreadPoolExecutor(20), "processpool": ProcessPoolExecutor(5)}scheduler.add_executor(executor=executors)

15、删除执行器

@csrf_exempt
def remove_executor(request):# 调度程序删除执行器, 事件代码是32alias = loads(request.body).get("alias")scheduler.remove_executor(alias=alias)return JsonResponse({"msg":"success"})

16、添加作业存储器

@csrf_exempt
def add_jobstore(request):# 调度程序添加作业存储器, 事件代码是64jobstores = {"default": DjangoJobStore()}scheduler.add_jobstore(jobstores=jobstores)

17、删除作业存储器

@csrf_exempt
def remove_jobstore(request):# 调度程序删除作业存储器, 事件代码是128alias = loads(request.body).get("alias")scheduler.remove_jobstore(alias=alias)return JsonResponse({"msg":"success"})

18、修改触发器参数

@csrf_exempt
def reschedule_job(request):# 调度程序修改触发器参数job_id = loads(request.body).get("job_id")trigger_args = loads(request.body).get("trigger_args")scheduler.reschedule_job(trigger_args=trigger_args, job_id=job_id)return JsonResponse({"msg":"success"})

 未完待续 ······

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/148645.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

免费分享一套SpringBoot+Vue火车票订票管理系统【论文+源码+SQL脚本】,帅呆了~~

大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue火车票订票管理系统,分享下哈。 项目视频演示 【免费】SpringbootVue火车票订票管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 传统办法管理信息首先需要花费的时间比较多&…

基于Springboot个性化图书推荐系统JAVA|VUE|SSM计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档(1万字以上)开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统:Window操作系统 2、开发工具:IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

优思学院|TQM和ISO9001有什么关系?

TQM 和 ISO 9001有什么关系?我们把这个问题交给AI,它的回答是: 老实说,说它答错,又不算是错,但说它答对,也不算,总之就是一种模凌两可的感觉。 为什么会这样?因为管理中…

【gradio介绍】Python 可视化 web 神器---gradio介绍

Gradio是一个开源的Python库,专为帮助开发者快速搭建和分享机器学习模型、API或任意Python函数的用户界面(UI)而设计。它基于FastAPI和Svelte,是一个易于部署且功能强大的Web界面构建工具,特别适用于展示和测试机器学习…

在产品上扩大库存?教你一招!全开源!

几乎所有人都会遇到的头疼问题:内存不够,因为很多照片、音频、文档药存储。。。 我们都知道芯片的储存都是寸土寸金的,内部不够只能外扩! 有没有简单一点的方法呢?实在不想编写各种驱动,替换Flash&#x…

探索未来:MultiOn,AI的下一个革命

文章目录 探索未来:MultiOn,AI的下一个革命背景:为什么选择MultiOn?MultiOn是什么?如何安装MultiOn?简单的库函数使用方法场景应用常见问题及解决方案总结 探索未来:MultiOn,AI的下一…

conda环境下module ‘numba.types‘ has no attribute ‘Macro‘问题解决

1 问题描述 conda环境下运行数据处理&#xff0c;报出如下错误&#xff1a; Traceback (most recent call last):File "train_preprocess.py", line 13, in <module>import audioFile "/opt/service/lipsync/audio.py", line 1, in <module>…

增强网络威胁防御能力的云安全新兴技术

一些行业专家强调了基于云的运营的独特网络安全需求&#xff0c;并指出保护敏感数据与传统的本地网络不同。尽管新兴技术并没有改变网络安全专业人员与犯罪分子之间持续的斗争&#xff0c;但它们提高了赌注&#xff0c;使斗争变得更加复杂。 如今&#xff0c;我们面对的是技术…

药用植物的空间多组学:从生物合成途径到工业应用-文献精读51

Spatial multi-omics in medicinal plants: from biosynthesis pathways to industrial applications 药用植物的空间多组学&#xff1a;从生物合成途径到工业应用 摘要 随着分子测序和成像技术的快速发展&#xff0c;药用植物的多组学研究进入了单细胞时代。我们讨论了空间多…

西安云仪:心无旁骛做实业 精益求精造仪表

仪器仪表&#xff0c;被誉为工业生产的“倍增器”&#xff0c;是国家测量精度和科技发展水平的重要体现。近年来&#xff0c;我国仪器仪表产业正在稳步增长。据统计&#xff0c;2023年实现营收10112亿元&#xff0c;正式进入万亿元时代&#xff0c;部分高端产品已经达到或接近国…

阿里云「通义灵码」迎来重磅升级,「AI 程序员」正式亮相!

最近两年&#xff0c;随着大语言模型和生成式 AI 技术的爆火&#xff0c;软件开发领域首当其冲成为了最热门的大模型应用场景之一&#xff0c;GitHub Copilot、通义灵码等 AI 辅助编程工具纷纷问世。这些工具通过自然语言处理和机器学习技术&#xff0c;能够理解开发者的意图&a…

USB转8路串口 USB转8路RS232 USB转8路TTL

一、功能描述 本模块采用CH348Q芯片作为主芯片&#xff0c;CH348 是一款高速 USB 总线的转接芯片&#xff0c;实现USB转八个异步串口UARTA/B/C/D/E/F/G/H 功能&#xff0c; 用于为计算机扩展异步串口&#xff0c;或者将普通的串口设备或者MCU直接升级到USB总线。外加4颗MAX323…

Leetcode 每日一题:Diameter of Binary Tree

写在前面&#xff1a; 最近被学校的 campus involvement 社团活动的招新宣传和选拔&#xff0c;以及找工作频繁的参加招聘会和网上申请忙的焦头烂额&#xff0c;马上又要到来的期中考试让我再次意识到了大学生活的险恶。虽然大家都说学生时代是最幸福的时代&#xff0c;但这个…

Vue3使用通信组件库mitt作为事件总线实现跨组件通信

mitt 介绍: Mitt 是一个在 Vue.js 应用程序中使用的小型事件总线库。该库允许组件进行通信&#xff0c;而不必过度依赖父级或子级组件之间的 props。 先看项目用例&#xff1a; 【 以下转载自&#xff1a;https://blog.csdn.net/yuanlong12178/article/details/139579299 】…

无人机飞手教员培训持证,必须会组装,模拟,维修才能带好学员

无人机飞手员的教培训不应仅仅局限于获取飞行执照或证书&#xff0c;而应是一个全面等多、方面的深入能力且&#xff0c;实践以确保导向能够的过程全面。、一个有效地合格的指导无人机学员飞。手教员不仅需要掌握扎实的飞行技能&#xff0c;还需要具备组装、模拟训练、维修。 组…

线性调频信号脉冲压缩并非是一个门信号

如果是频域是门信号&#xff0c;时域是sinc信号&#xff0c;时间越长震荡只会越小。图象是线性卷积做的&#xff0c;肯定没错。

SGLang——结构化语言模型程序的高效执行

前言 大型语言模型 (LLM) 越来越多地用于需要多次生成调用、高级提示技术、控制流和结构化输入/输出的复杂任务。然而&#xff0c;缺乏用于编程和执行这些应用程序的高效系统。新推出的系统 SGLang 旨在通过提供复杂语言模型程序的高效执行来解决这一问题。SGLang 包含前端语言…

828华为云征文|华为云Flexus X轻松实现Redis一主多从高效部署

目录 前言 一、华为云Flexus X加速Redis购买 1.1 Flexus X实例购买 1.2 Redis加速镜像选择 1.3 重置密码 1.4 登录Flexus X实例 1.5 Flexus X实例Redis验证 二、华为云Flexus X主节点Redis配置 2.1 重置密码 2.2 Redis外部访问配置 三、华为云Flexus X从节点Redis配置 3.1 从机…

亚马逊商品详情数据接口:提升运营排名的工具

亚马逊商品详情数据接口是亚马逊平台提供的一种服务&#xff0c;允许用户通过程序调用API&#xff08;应用程序接口&#xff09;来获取亚马逊商品的相关数据。这个接口为开发者和商家提供了丰富的商品信息&#xff0c;有助于优化用户体验、支持购买决策、竞品分析和市场研究等。…

Comfyui海报工作流:出图快,质量高!

前言 工作流获取方式放在这里了 在快节奏的现代生活中&#xff0c;高效的工作流程对于企业和个人而言&#xff0c;无疑是提升竞争力的关键。 特别是在设计领域&#xff0c;能够快速而精准地完成海报设计&#xff0c;不仅意味着时间的节省&#xff0c;更代表着工作效率的飞跃。…