在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中使用socket发送HTTP请求数据接收不完整问题解决方法
Feb 04 Python
在Apache服务器上同时运行多个Django程序的方法
Jul 22 Python
举例讲解Python编程中对线程锁的使用
Jul 12 Python
Python简单实现Base64编码和解码的方法
Apr 29 Python
python3+PyQt5重新实现QT事件处理程序
Apr 19 Python
python sys,os,time模块的使用(包括时间格式的各种转换)
Apr 27 Python
Python多线程编程之多线程加锁操作示例
Sep 06 Python
python3.6.3安装图文教程 TensorFlow安装配置方法
Jun 24 Python
Python实现八皇后问题示例代码
Dec 09 Python
浅析Django中关于session的使用
Dec 30 Python
浅析matlab中imadjust函数
Feb 27 Python
OpenCV-Python实现怀旧滤镜与连环画滤镜
Jun 09 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
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
使用prototype.js进行异步操作
2007/02/07 Javascript
JQuery UI皮肤定制
2009/07/27 Javascript
javascript下4个跨浏览器必备的函数
2010/03/07 Javascript
javascript获取元素CSS样式代码示例
2013/11/28 Javascript
JavaScript判断一个字符串是否包含指定子字符串的方法
2015/03/18 Javascript
javascript与Python快速排序实例对比
2015/08/10 Javascript
原生javascript实现addClass,removeClass,hasClass函数
2016/02/25 Javascript
jQuery 插件实现随机自由弹跳气泡样式
2017/01/12 Javascript
如何使用angularJs
2017/05/08 Javascript
如何编写一个完整的Angular4 FormText 组件
2017/11/18 Javascript
vue如何进行动画的封装
2018/09/26 Javascript
JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析
2020/02/12 Javascript
[00:32]2018DOTA2亚洲邀请赛EG出场
2018/04/03 DOTA
Python处理JSON数据并生成条形图
2016/08/05 Python
Python实现的计算器功能示例
2018/04/26 Python
使用sklearn之LabelEncoder将Label标准化的方法
2018/07/11 Python
python实现京东订单推送到测试环境,提供便利操作示例
2019/08/09 Python
Python 自动登录淘宝并保存登录信息的方法
2019/09/04 Python
详解pandas.DataFrame.plot() 画图函数
2020/06/14 Python
在Python中实现字典反转案例
2020/12/05 Python
python+selenium爬取微博热搜存入Mysql的实现方法
2021/01/27 Python
Python接口自动化系列之unittest结合ddt的使用教程详解
2021/02/23 Python
html5与css3小应用
2013/04/03 HTML / CSS
法国时尚童装网站:Melijoe
2016/08/10 全球购物
基督教卡片、励志礼品、家居装饰等:DaySpring
2018/10/12 全球购物
同居协议书范本
2014/04/23 职场文书
大学生学习计划书
2014/09/15 职场文书
业绩倒数第一的检讨书
2014/09/24 职场文书
成绩报告单家长评语
2014/12/30 职场文书
匿名检举信范文
2015/03/02 职场文书
焦裕禄纪念馆观后感
2015/06/09 职场文书
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
2021/04/17 Vue.js
apache基于端口创建虚拟主机的示例
2021/04/24 Servers
【TED出品】天梯非主流开心游1700 划水骑士
2022/03/31 魔兽争霸
win10搭建配置ftp服务器的方法
2022/08/05 Servers