在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的批量远程管理和部署工具Fabric用法实例
Jan 23 Python
python用装饰器自动注册Tornado路由详解
Feb 14 Python
Python使用SQLite和Excel操作进行数据分析
Jan 20 Python
python DataFrame 修改列的顺序实例
Apr 10 Python
python获取代理IP的实例分享
May 07 Python
Python生成rsa密钥对操作示例
Apr 26 Python
Python文件操作函数用法实例详解
Dec 24 Python
python打印文件的前几行或最后几行教程
Feb 13 Python
python实现快递价格查询系统
Mar 03 Python
python数据分析工具之 matplotlib详解
Apr 09 Python
关于python中导入文件到list的问题
Oct 31 Python
详解python中的异常捕获
Dec 15 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
openflashchart 2.0 简单案例php版
2012/05/21 PHP
宝塔面板在NGINX环境中TP5.1如何运行?
2021/03/09 PHP
接收键盘指令的脚本
2006/06/26 Javascript
JavaScript操作XML实例代码(获取新闻标题并分页,并分页)
2010/05/25 Javascript
基于jQuery的树控件实现代码(asp.net+json)
2010/07/11 Javascript
jQuery控制图片的hover效果(smartRollover.js)
2012/03/18 Javascript
关于extjs treepanel复选框选中父节点与子节点的问题
2013/04/02 Javascript
jquery快捷动态绑定键盘事件的操作函数代码
2013/10/17 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
2014/05/28 Javascript
JS遍历页面所有对象属性及实现方法
2016/08/01 Javascript
浅谈javascript中遇到的字符串对象处理
2016/11/18 Javascript
Bootstrap基本模板的使用和理解1
2016/12/14 Javascript
JavaScript正则替换HTML标签功能示例
2017/03/02 Javascript
[02:42]2014DOTA2国际邀请赛 三冰专访:我会打到Ti20
2014/07/13 DOTA
Python中的集合类型知识讲解
2015/08/19 Python
Python基于回溯法子集树模板实现图的遍历功能示例
2017/09/05 Python
python timestamp和datetime之间转换详解
2017/12/11 Python
Python实现发送与接收邮件的方法详解
2018/03/28 Python
如何在Cloud Studio上执行Python代码?
2019/08/09 Python
通过python实现windows桌面截图代码实例
2020/01/17 Python
python爬虫实现获取下一页代码
2020/03/13 Python
Python下划线5种含义代码实例解析
2020/07/10 Python
CSS3自定义滚动条样式的示例代码
2017/08/21 HTML / CSS
html5桌面通知(Web Notifications)实例解析
2014/07/07 HTML / CSS
canvas学习和滤镜实现代码
2018/08/22 HTML / CSS
ProBikeKit新西兰:自行车套件,跑步和铁人三项装备
2017/04/05 全球购物
马来西亚网上购物:Youbeli
2018/03/30 全球购物
MAC彩妆英国官网:M·A·C UK
2018/05/30 全球购物
儿科护士实习自我鉴定
2013/10/17 职场文书
医学生自我评价
2014/01/27 职场文书
出国留学经济担保书
2014/04/01 职场文书
三八红旗集体先进事迹材料
2014/05/22 职场文书
党员查摆四风问题思想汇报
2014/10/25 职场文书
入党积极分子半年考察意见
2015/06/02 职场文书
职场:企业印章管理制度(模板)
2019/10/18 职场文书
Python如何导出导入所有依赖包详解
2021/06/08 Python