python版本:3.7 django版本:3.1 django-apschuler版本:0.5.2
安装apscheduler 模块
pip install apscheduler
pip install django-apscheduler
将 django-apscheduler 加到项目中settings的INSTALLED_APPS中
INSTALLED_APPS = [
....
'django_apscheduler',
]
执行迁移命令
python manage.py migrate
会创建两张表:django_apscheduler_djangojob/django_apscheduler_djangojobexecution
创建一个专门定时任务app或者在一元app的view.py中嵌入你的定时任务代码
try:
scheduler = BackgroundScheduler(timezone=settings.TIME_ZONE) # timezone是用来设置时区的
scheduler.add_jobstore(DjangoJobStore(), "default")
# 'cron', hour = "23", minute = "59" 周期执行
@register_job(scheduler, 'interval', seconds=3, id="text") # 每隔3s执行一次
def text():
print("我是apscheduler定时任务")
# register_events(scheduler) 之前版本的django-apschuler需要注册,现在不需要了
scheduler.start()
print("任务启动!")
except Exception as e:
print("定时服务错误,已关闭:%s" % e)
# 有错误就停止定时器
scheduler.shutdown()
运行结果如下:
测试django-apschuler的多线程,在我们的text函数中加入延时:
try:
scheduler = BackgroundScheduler(timezone=settings.TIME_ZONE) # timezone是用来设置时区的
scheduler.add_jobstore(DjangoJobStore(), "default")
# 'cron', hour = "23", minute = "59" 周期执行
@register_job(scheduler, 'interval', seconds=3, id="text") # 每隔3s执行一次
def text():
time.sleep(4) # 间隔4s输出,测试多线程
print("我是apscheduler定时任务")
# register_events(scheduler)
scheduler.start()
print("任务启动!")
except Exception as e:
print("定时服务错误,已关闭:%s" % e)
# 有错误就停止定时器
scheduler.shutdown()
运行结果如下:
这是因为BackgroundScheduler的默认线程数量为1,当我们之前的job还没有运行结束时无法执行下一个任务,设置最大线程数量为5:
try:
# 设置最大线程数为5
job_defaults = {'max_instances': 5}
scheduler = BackgroundScheduler(timezone=settings.TIME_ZONE, job_defaults=job_defaults)
scheduler.add_jobstore(DjangoJobStore(), "default")
# 'cron', hour = "23", minute = "59" 周期执行
@register_job(scheduler, 'interval', seconds=3, id="text") # 每隔3s执行一次
def text():
time.sleep(4) # 间隔4s输出,测试多线程
print("%s我是apscheduler定时任务" % datetime.datetime.now())
# register_events(scheduler)
scheduler.start()
print("任务启动!")
except Exception as e:
print("定时服务错误,已关闭:%s" % e)
# 有错误就停止定时器
scheduler.shutdown()
运行结果如下:
注意:register_events(scheduler) 之前版本的django-apschuler定时任务需要注册,现在不需要了,网上的相关教程都是说要使用register_events(scheduler)注册定时任务,被坑了许久,最后去GitHub上查看了django-apschuler的相关说明才发现这个已经被删除了