在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 pickle 和 shelve模块的用法
Sep 16 Python
Python内置函数之filter map reduce介绍
Nov 30 Python
Python从MP3文件获取id3的方法
Jun 15 Python
python如何查看系统网络流量的信息
Sep 12 Python
Python和C/C++交互的几种方法总结
May 11 Python
python snownlp情感分析简易demo(分享)
Jun 04 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
Jun 11 Python
详解Python 中sys.stdin.readline()的用法
Sep 12 Python
Mac PyCharm中的.gitignore 安装设置教程
Apr 16 Python
python判断一个变量是否已经设置的方法
Aug 13 Python
pytorch Dropout过拟合的操作
May 27 Python
python 爬取华为应用市场评论
May 29 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
ThinkPHP的URL重写问题
2014/06/22 PHP
WordPress中用于获取文章作者与分类信息的方法整理
2015/12/17 PHP
在laravel5.2中实现点击用户头像更改头像的方法
2019/10/14 PHP
利用js跨页面保存变量做菜单的方法
2008/01/17 Javascript
获取HTML DOM节点元素的方法的总结
2009/08/21 Javascript
jquery无缝向上滚动实现代码
2013/03/29 Javascript
jQuery如何防止这种冒泡事件发生
2015/02/27 Javascript
JavaScript中使用数组方法汇总
2016/02/16 Javascript
JQuery和HTML5 Canvas实现弹幕效果
2017/01/04 Javascript
AngularJs实现聊天列表实时刷新功能
2017/06/15 Javascript
vue.js国际化 vue-i18n插件的使用详解
2017/07/07 Javascript
Angular.js中window.onload(),$(document).ready()的写法浅析
2017/09/28 Javascript
对vue下点击事件传参和不传参的区别详解
2018/09/15 Javascript
Vue中props的详解
2019/05/16 Javascript
layui table动态表头 改变表格头部 重新加载表格的方法
2019/09/21 Javascript
vue实现多级菜单效果
2019/10/19 Javascript
解决 window.onload 被覆盖的问题方法
2020/01/14 Javascript
[50:28]LGD女子学院第三期 DOTA2复仇之魂教学
2013/12/24 DOTA
[04:02]2014DOTA2国际邀请赛 BBC每日综述中国战队将再度登顶
2014/07/21 DOTA
python实现堆栈与队列的方法
2015/01/15 Python
python结合opencv实现人脸检测与跟踪
2015/06/08 Python
编写Python CGI脚本的教程
2015/06/29 Python
Python简单获取网卡名称及其IP地址的方法【基于psutil模块】
2018/05/24 Python
基于DATAFRAME中元素的读取与修改方法
2018/06/08 Python
用pyqt5 给按钮设置图标和css样式的方法
2019/06/24 Python
Python文件操作方法详解
2020/02/09 Python
Python实现曲线拟合的最小二乘法
2021/02/19 Python
CSS3实现王者匹配时的粒子动画效果
2019/04/12 HTML / CSS
html5 postMessage解决跨域、跨窗口消息传递方案
2016/12/20 HTML / CSS
联想墨西哥官方网站:Lenovo墨西哥
2016/08/17 全球购物
自荐信的基本格式
2014/02/22 职场文书
大学英语专业求职信
2014/06/21 职场文书
一份没有按时交货失信于客户的检讨书
2014/09/19 职场文书
租房协议书范例
2014/10/14 职场文书
2015年感恩父亲节活动策划方案
2015/05/05 职场文书
解决redis sentinel 频繁主备切换的问题
2021/04/12 Redis