在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实例之wxpython中Frame使用方法
Jun 09 Python
pymongo实现控制mongodb中数字字段做加法的方法
Mar 26 Python
python使用BeautifulSoup分析网页信息的方法
Apr 04 Python
Python模块结构与布局操作方法实例分析
Jul 24 Python
Python 微信爬虫完整实例【单线程与多线程】
Jul 06 Python
pow在python中的含义及用法
Jul 11 Python
python实现最小二乘法线性拟合
Jul 19 Python
使用Python实现画一个中国地图
Nov 23 Python
django项目中新增app的2种实现方法
Apr 01 Python
PyQt5实现登录页面
May 30 Python
Flask缓存静态文件的具体方法
Aug 02 Python
教你怎么用python selenium实现自动化测试
May 27 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的QRcode类与大家分享
2011/11/13 PHP
php标签云的实现代码
2012/10/10 PHP
PHP简单获取视频预览图的方法
2015/03/12 PHP
PHP几个实用自定义函数小结
2016/01/25 PHP
PHPCMS手机站伪静态设置详细教程
2017/02/06 PHP
php 一维数组的循环遍历实现代码
2017/04/10 PHP
javascript 冒泡排序 正序和倒序实现代码
2010/12/14 Javascript
基于jquery的高性能td和input切换并可修改内容实现代码
2011/01/09 Javascript
表单元素的submit()方法和onsubmit事件应用概述
2013/02/01 Javascript
setTimeout()与setInterval()方法区别介绍
2013/12/24 Javascript
优化javascript的执行效率一些方法总结
2013/12/25 Javascript
ExtJS如何设置与获取radio控件的选取状态
2014/01/22 Javascript
JavaScript获取图片真实大小代码实例
2014/09/24 Javascript
Nodejs为什么选择javascript为载体语言
2015/01/13 NodeJs
深入解析JavaScript中的立即执行函数
2016/05/21 Javascript
jQuery leonaScroll 1.1 自定义滚动条插件(推荐)
2016/09/17 Javascript
Vuex利用state保存新闻数据实例
2017/06/28 Javascript
Angular限制input框输入金额(是小数的话只保留两位小数点)
2017/07/13 Javascript
javascript获取指定区间范围随机数的方法
2017/09/08 Javascript
详解angularjs实现echart图表效果最简洁教程
2017/11/29 Javascript
jquery的 filter()方法使用教程
2018/03/22 jQuery
npm 下载指定版本的组件方法
2018/05/17 Javascript
详解nodejs http请求相关总结
2019/03/31 NodeJs
使用layui实现树形结构的方法
2019/09/20 Javascript
[01:06:25]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
Python字符串逐字符或逐词反转方法
2015/05/21 Python
python数据抓取分析的示例代码(python + mongodb)
2017/12/25 Python
Django重置migrations文件的方法步骤
2019/05/01 Python
让Django的BooleanField支持字符串形式的输入方式
2020/05/20 Python
python实现人性化显示金额数字实例详解
2020/09/25 Python
舞蹈教师自荐信
2014/01/27 职场文书
《阳光》教学反思
2014/02/23 职场文书
公司爱心捐款倡议书
2014/05/14 职场文书
北京申奥口号
2014/06/19 职场文书
小学体育队列队形教学反思
2016/02/16 职场文书
python实现商品进销存管理系统
2022/05/30 Python