在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实现的二维码生成小软件
Jul 11 Python
使用70行Python代码实现一个递归下降解析器的教程
Apr 17 Python
Python3通过Luhn算法快速验证信用卡卡号的方法
May 14 Python
Python编程中time模块的一些关键用法解析
Jan 19 Python
Python使用BeautifulSoup库解析HTML基本使用教程
Mar 31 Python
Python使用plotly绘制数据图表的方法
Jul 18 Python
基于Python对象引用、可变性和垃圾回收详解
Aug 21 Python
windows下安装python的C扩展编译环境(解决Unable to find vcvarsall.bat)
Feb 21 Python
python dlib人脸识别代码实例
Apr 04 Python
python腾讯语音合成实现过程解析
Aug 01 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
Dec 09 Python
详解Django中的FBV和CBV对比分析
Mar 01 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 MYSQL中插入当前时间
2008/04/06 PHP
使用PHP的日期与时间函数技巧
2008/04/24 PHP
PHP伪静态页面函数附使用方法
2008/06/20 PHP
PHP Zip解压 文件在线解压缩的函数代码
2010/05/26 PHP
php判断用户是否手机访问代码
2015/06/08 PHP
smarty中常用方法实例总结
2015/08/07 PHP
利用php操作memcache缓存的基础方法示例
2017/08/02 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
2018/08/02 PHP
php使用event扩展的io复用测试的示例
2020/10/20 PHP
jQuery中RadioButtonList的功能及用法实例介绍
2013/08/23 Javascript
jquery和ajax的关系详细介绍
2013/11/29 Javascript
node.js中的path.dirname方法使用说明
2014/12/09 Javascript
jQuery实现数字加减效果汇总
2014/12/16 Javascript
JS+CSS实现美化的下拉列表框效果
2015/08/11 Javascript
js HTML5 Canvas绘制转盘抽奖
2020/09/13 Javascript
jQuery解决input元素的blur事件和其他非表单元素的click事件冲突问题
2016/08/15 Javascript
Angular2学习笔记——详解路由器模型(Router)
2016/12/02 Javascript
解决ionic和angular上拉加载的问题
2017/08/03 Javascript
Vue中的Vux配置指南
2017/12/08 Javascript
node.js中fs文件系统目录操作与文件信息操作
2018/02/24 Javascript
详解Vue依赖收集引发的问题
2019/04/22 Javascript
Python日志模块logging简介
2015/04/13 Python
探究python中open函数的使用
2016/03/01 Python
详解Python使用simplejson模块解析JSON的方法
2016/03/24 Python
浅谈pytorch和Numpy的区别以及相互转换方法
2018/07/26 Python
python+openCV调用摄像头拍摄和处理图片的实现
2019/08/06 Python
Python3标准库之threading进程中管理并发操作方法
2020/03/30 Python
Python实现发票自动校核微信机器人的方法
2020/05/22 Python
谈谈python垃圾回收机制
2020/09/27 Python
Selenium关闭INFO:CONSOLE提示的解决
2020/12/07 Python
纯CSS3实现漂亮的input输入框动画样式库(Text input love)
2018/12/29 HTML / CSS
HTML5 placeholder(空白提示)属性介绍
2013/08/07 HTML / CSS
政法大学毕业生自荐信范文
2014/01/01 职场文书
通知的写法
2015/04/23 职场文书
格列佛游记读书笔记
2015/06/30 职场文书
恶魔之树最顶端的三颗果实 震震果实上榜,第一可以制造岩浆
2022/03/18 日漫