在django-xadmin中APScheduler的启动初始化实例


Posted in Python onNovember 15, 2019

环境: python3.5.x + django1.9.x + xadmin-for-python3

APScheduler做为一个轻量级和使用量很多的后台任务计划(scheduler)包,可以方便的随系统启动/关闭而启动/关闭,如果整合到django中,启动APScheduler的代码该写在哪里好呢,

以下几个方式供参考:

1. (推荐)自定义Middleware,非常类似Java中的Filter,缺点是要有URL访问才会触发启动,如果系统还没有启动完就访问了URL会触发__init__多次调用(多次http同时请求造成),可以通过threading的lock同步代码和状态限制执行一次

class StartupMiddleware(object):
 def __init__(self):
  #启动后台任务APScheduler
  init_scheduler()
 
  from django.core.exceptions import MiddlewareNotUsed
  raise MiddlewareNotUsed #TIP 抛出此异常,则Django将从 middleware 栈中移出该 middleware,请求就不会经过此middleware
 
 def process_request(self, request):
  print("*****enter startup middleware")
scheduler = None
def init_scheduler():
 global scheduler
 lock = threading.Lock() # TIP 多线程同步代码
 with lock:
  if scheduler and scheduler.running:
   print('*****APScheduler is already started, pid:{}, tid:{}'.format(os.getpid(), threading.current_thread().getName()))
   return scheduler
  executors = {
   'default': ThreadPoolExecutor(5),#线程模式下进程池大小
   'processpool': ProcessPoolExecutor(5),#进程模式下进程池大小
  }
  job_defaults = {
   'coalesce': True, #如果有几次未执行,条件可以时是否只执行一次
   'max_instances': 1, #同一个job同一时间最多有几个实例再跑
  }
 
  scheduler = BackgroundScheduler(executors=executors, job_defaults=job_defaults, timezone=timezone(TIME_ZONE))
 
  scheduler.add_job(...)
  scheduler.start()
  return scheduler

2. 应用中的settings.py文件,django在开发环境默认会启动两个python进程(对于开发环境还是很实用的,改代码后会自动重启),放settings.py中的代码会被这两个python进程都调用一次,当然可以通过--reload参数只启动一个python进程,另外加载settings.py时部分app还未loaded,限制了应用的代码。

3. 顶层的urls文件, 这个不管你django启动时是一个进程还是两个进程,urls文件也只会被加载一次,但存在的缺陷就是在执行makemigrations这样的命令时,会同样出现app还未loaded的错...

以上这篇在django-xadmin中APScheduler的启动初始化实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中查找excel某一列的重复数据 剔除之后打印
Feb 10 Python
使用Python3制作TCP端口扫描器
Apr 17 Python
Python实现判断一个字符串是否包含子串的方法总结
Nov 21 Python
Python中的pygal安装和绘制直方图代码分享
Dec 08 Python
利用python将pdf输出为txt的实例讲解
Apr 23 Python
Python递归函数 二分查找算法实现解析
Aug 12 Python
python安装gdal的两种方法
Oct 29 Python
Pytorch maxpool的ceil_mode用法
Feb 18 Python
使用opencv识别图像红色区域,并输出红色区域中心点坐标
Jun 02 Python
python语言实现贪吃蛇游戏
Nov 13 Python
python实现ping命令小程序
Dec 28 Python
Python 中面向接口编程
May 20 Python
解决django-xadmin列表页filter关联对象搜索问题
Nov 15 #Python
Python获取统计自己的qq群成员信息的方法
Nov 15 #Python
在Python中字符串、列表、元组、字典之间的相互转换
Nov 15 #Python
Django xadmin开启搜索功能的实现
Nov 15 #Python
Django 实现外键去除自动添加的后缀‘_id’
Nov 15 #Python
django中media媒体路径设置的步骤
Nov 15 #Python
Python中BeautifuSoup库的用法使用详解
Nov 15 #Python
You might like
萌王史莱姆”萌王性别尴尬!那“萌战”归女组还是男?
2018/12/17 日漫
人大复印资料处理程序_查询篇
2006/10/09 PHP
PHP添加MySQL数据记录代码
2008/06/07 PHP
php Http_Template_IT类库进行模板替换
2009/03/19 PHP
php 将bmp图片转为jpg等其他任意格式的图片
2009/06/21 PHP
PHP下escape解码函数的实现方法
2010/08/08 PHP
php生成数字字母的验证码图片
2015/07/14 PHP
php注册和登录界面的实现案例(推荐)
2016/10/24 PHP
php中文乱码问题的终极解决方案汇总
2017/08/01 PHP
Laravel 添加多语言提示信息的方法
2019/09/29 PHP
greybox——不开新窗口看新的网页
2007/02/20 Javascript
用javascript实现读取txt文档的脚本
2007/07/20 Javascript
jquery如何把数组变为字符串传到服务端并处理
2014/04/30 Javascript
jquery获取tagName再进行判断
2014/05/29 Javascript
AngularJS 日期格式化详解
2015/12/23 Javascript
JS平滑无缝滚动效果的实现代码
2016/05/06 Javascript
JS简单设置下拉选择框默认值的方法
2016/08/20 Javascript
探究JavaScript中的五种事件处理程序方式
2016/12/07 Javascript
Angularjs实现分页和分页算法的示例代码
2016/12/23 Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
2017/03/02 Javascript
Node.js pipe实现源码解析
2017/08/12 Javascript
如何阻止小程序遮罩层下方图层滚动
2019/09/05 Javascript
jQuery+css实现的点击图片放大缩小预览功能示例【图片预览 查看大图】
2020/05/29 jQuery
[10:34]DOTA2上海特级锦标赛全纪录
2016/03/25 DOTA
python中logging库的使用总结
2017/10/18 Python
python 在指定范围内随机生成不重复的n个数实例
2019/01/28 Python
python实现百度OCR图片识别过程解析
2020/01/17 Python
python中关于数据类型的学习笔记
2020/07/19 Python
利用django创建一个简易的博客网站的示例
2020/09/29 Python
如何解决python多种版本冲突问题
2020/10/13 Python
Hotels.com加拿大:领先的在线住宿网站
2018/10/05 全球购物
美国电子产品购物网站:BuyDig.com
2020/06/17 全球购物
酒店副总岗位职责
2013/12/24 职场文书
安全生产一岗双责责任书
2014/07/28 职场文书
邮政营业员岗位职责
2015/04/14 职场文书
财务部岗位职责范本
2015/04/14 职场文书