在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中global与nonlocal比较
Nov 21 Python
Python两个整数相除得到浮点数值的方法
Mar 18 Python
python学习 流程控制语句详解
Jun 01 Python
轻松掌握python设计模式之策略模式
Nov 18 Python
Python切片操作深入详解
Jul 27 Python
Python中Proxypool库的安装与配置
Oct 19 Python
Python将字符串常量转化为变量方法总结
Mar 17 Python
python集合常见运算案例解析
Oct 17 Python
浅谈JupyterNotebook导出pdf解决中文的问题
Apr 22 Python
Python连接Impala实现步骤解析
Aug 04 Python
Python Socket多线程并发原理及实现
Dec 11 Python
教你用python实现12306余票查询
Jun 30 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
PHP读取目录下所有文件的代码
2008/01/07 PHP
简单解决新浪SAE无法上传文件的问题
2015/05/13 PHP
php实现网站留言板功能
2015/11/04 PHP
PHP中“=>
2019/03/01 PHP
学习YUI.Ext 第四天--对话框Dialog的使用
2007/03/10 Javascript
避免回车键导致的页面无意义刷新的解决方法
2011/04/12 Javascript
Jquery 实现表格颜色交替变化鼠标移过颜色变化实例
2013/08/28 Javascript
jQuery+Ajax请求本地数据加载商品列表页并跳转详情页的实现方法
2017/07/12 jQuery
ES6学习之变量的两种命名方法示例
2017/07/18 Javascript
node.js 核心http模块,起一个服务器,返回一个页面的实例
2017/09/11 Javascript
浅谈JavaScript作用域和闭包
2017/09/18 Javascript
Bootstrap table使用方法汇总
2017/11/17 Javascript
jQuery实现浏览器之间跳转并传递参数功能【支持中文字符】
2018/03/28 jQuery
vue中多个倒计时实现代码实例
2019/03/27 Javascript
jquery 验证用户名是否重复代码实例
2019/05/14 jQuery
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
[03:22]DAC最前线(第二期)—DOTA2亚洲邀请赛主赛场周边及线路探访
2015/01/24 DOTA
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
2017/08/21 Python
解决使用PyCharm时无法启动控制台的问题
2019/01/19 Python
树莓派极简安装OpenCv的方法步骤
2019/10/10 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
2019/11/19 Python
找Python安装目录,设置环境路径以及在命令行运行python脚本实例
2020/03/09 Python
python设置中文界面实例方法
2020/10/27 Python
基于Python爬取搜狐证券股票过程解析
2020/11/18 Python
深入理解css属性的选择对动画性能的影响
2016/04/20 HTML / CSS
HTML5 Canvas画线技巧——实现绘制一个像素宽的细线
2013/08/02 HTML / CSS
爱尔兰电子产品购物网站:Komplett.ie
2018/04/04 全球购物
Big Green Smile法国:领先的英国有机和天然产品在线商店
2021/01/02 全球购物
个人优缺点自我评价
2014/01/27 职场文书
秋游活动策划方案
2014/02/16 职场文书
校园安全演讲稿
2014/05/09 职场文书
乡镇四风对照检查材料
2014/08/31 职场文书
2014年工程部工作总结
2014/11/25 职场文书
公务员政审个人总结
2015/02/12 职场文书
python通过函数名调用函数的几种方法总结
2021/06/07 Python
Android移动应用开发指南之六种布局详解
2022/09/23 Java/Android