为了对任务进行更细粒度的操作,我们在django集成了apschedule
新建app:jobSchedule
#urls.py from django.urls import path from . import views app_name = 'jobSchedule' urlpatterns = [ path('', views.index, name='index'), path('add_task/<str:task>/', views.add_task), path('pause_task/<str:task>/', views.pause_task), path('resume_task/<str:task>/', views.resume_task), path('remove_task/<str:task>/', views.remove_task), path('desc_task/', views.desc_task), ]
views.py
from django.http import HttpResponse, JsonResponse from django.shortcuts import render # Create your views here. import datetime from apscheduler.schedulers.background import BackgroundScheduler def job_func(text): print("当前时间:" + text, datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]) scheduler = BackgroundScheduler() scheduler.add_job(job_func, 'cron', second='0,20,40', args=("sss",)) scheduler.start() def index(request): return None # 添加任务 def add_task(request, task=None): scheduler.add_job(job_func, 'cron', second='10,30,50', id=task, args=(task,)) return HttpResponse("success") # 暂停任务 def pause_task(request, task=None): scheduler.pause_job(task) return HttpResponse("pause success") # 重启任务 def resume_task(request, task=None): scheduler.resume_job(task) return HttpResponse("resume success") # 删除任务 def remove_task(request, task=None): scheduler.remove_job(task) return HttpResponse("remove success") # 描述任务 def desc_task(request): jobs = scheduler.get_jobs() new_jobs = [] for item in jobs: job = {} job['name'] = item.name job['id'] = item.id job['args'] = item.args new_jobs.append(job) return JsonResponse(new_jobs, safe=False)
新获取的经验点是schedule启动一次即可,即使后来添加删除了job,不需要重新start
二、使用MySQL做存储库
上面的任务都是在内存存储的,程序停止之后都没有了。生产肯定不能这样的
除内存外,apscheduler支持mongodb,redis,mysql等各种存储,我们以最常见的MySQL写个例子。
jobstores = { 'default': SQLAlchemyJobStore(url='mysql+pymysql://root:password@ip:3306/dbname?charset=utf8') }
不指定表名,程序会自动在数据库创建一张名为apscheduler_jobs的表来序列化我们的任务。
在创建scheduler时指定jobstore
scheduler = BackgroundScheduler(jobstores=jobstores)
之后我们再添加任务,就需要指定id,并且增加一个参数
id用于唯一标识一个任务,replace_existing=True用于再添加重名任务时覆盖原有记录而不是直接报错
scheduler.add_job(job_func, 'cron', second='0,20,40', args=("sss",),id='sss',replace_existing=True)