在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深入学习之内存管理
Aug 31 Python
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
Apr 23 Python
Python通过matplotlib绘制动画简单实例
Dec 13 Python
python实现爬取图书封面
Jul 05 Python
使用Python画出小人发射爱心的代码
Nov 23 Python
Python内置类型性能分析过程实例
Jan 29 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
Mar 25 Python
详解pandas获取Dataframe元素值的几种方法
Jun 14 Python
python基于exchange函数发送邮件过程详解
Nov 06 Python
Python性能测试工具Locust安装及使用
Dec 01 Python
字典算法实现及操作 --python(实用)
Mar 31 Python
python 离散点图画法的实现
Apr 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五种设计模式小结
2011/03/23 PHP
php随机取mysql记录方法小结
2014/12/27 PHP
laravel 实现划分admin和home 模块分组
2019/10/15 PHP
分析 JavaScript 中令人困惑的变量赋值
2007/08/13 Javascript
javascript据option的value值快速设定初始的selected选项
2007/08/13 Javascript
JS控件的生命周期介绍
2012/10/22 Javascript
JavaScript 函数参数是传值(byVal)还是传址(byRef) 分享
2013/07/02 Javascript
js Array操作的最简短最容易理解方法
2013/12/09 Javascript
javascript制作的网页侧边弹出框思路及实现代码
2014/05/21 Javascript
浅谈Javascript中Object与Function对象
2015/09/26 Javascript
下一代Bootstrap的5个特点 超酷炫!
2016/06/17 Javascript
js获取html的span标签的值方法(超简单)
2016/07/26 Javascript
AngularJS操作键值对象类似java的hashmap(填坑小结)
2016/11/12 Javascript
node.js 和HTML5开发本地桌面应用程序
2016/12/13 Javascript
理解AngularJs篇:30分钟快速掌握AngularJs
2016/12/23 Javascript
如何提高数据访问速度
2016/12/26 Javascript
ES6入门教程之let和const命令详解
2017/05/17 Javascript
极简主义法编写JavaScript类
2017/11/02 Javascript
JavaScript实现写入文件到本地的方法【基于FileSaver.js插件】
2018/03/15 Javascript
微信小程序设置滚动条过程详解
2019/07/25 Javascript
layui递归实现动态左侧菜单
2019/07/26 Javascript
由Python运算π的值深入Python中科学计算的实现
2015/04/17 Python
python实现的多线程端口扫描功能示例
2017/01/21 Python
对Pycharm创建py文件时自定义头部模板的方法详解
2019/02/12 Python
python抖音表白程序源代码
2019/04/07 Python
对python中的os.getpid()和os.fork()函数详解
2019/08/08 Python
Python正则表达式学习小例子
2020/03/03 Python
虚拟机下载python是否需要联网
2020/07/27 Python
租租车:国际租车、美国租车、欧洲租车、特价预订国外租车(中文服务)
2018/03/28 全球购物
大学社团活动总结
2014/04/26 职场文书
市级文明单位申报材料
2014/05/07 职场文书
美国留学经济担保书
2014/05/20 职场文书
汽车运用工程专业求职信
2014/06/18 职场文书
学习《中小学教师职业道德规范》心得体会
2016/01/18 职场文书
详解Laravel服务容器的优势
2021/05/29 PHP
MySQL串行化隔离级别(间隙锁实现)
2022/06/16 MySQL