在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多线程和队列操作实例
Jun 21 Python
Windows中安装使用Virtualenv来创建独立Python环境
May 31 Python
Django Highcharts制作图表
Aug 27 Python
Python入门之三角函数全解【收藏】
Nov 08 Python
python实现决策树分类(2)
Aug 30 Python
Django 中间键和上下文处理器的使用
Mar 17 Python
PyQt5笔记之弹出窗口大全
Jun 20 Python
python argparser的具体使用
Nov 10 Python
python jenkins 打包构建代码的示例代码
Nov 29 Python
详解BeautifulSoup获取特定标签下内容的方法
Dec 07 Python
在Django中使用MQTT的方法
May 10 Python
python神经网络Xception模型
May 06 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
PHP4实际应用经验篇(3)
2006/10/09 PHP
使用php重新实现PHP脚本引擎内置函数
2007/03/06 PHP
php中将地址生成迅雷快车旋风链接的代码[测试通过]
2011/04/20 PHP
laravel http 自定义公共验证和响应的方法
2019/09/29 PHP
url 特殊字符 传递参数解决方法
2010/01/01 Javascript
跨浏览器开发经验总结(四) 怎么写入剪贴板
2010/05/13 Javascript
(jQuery,mootools,dojo)使用适合自己的编程别名命名
2010/09/14 Javascript
js二级地域选择的实现方法
2013/06/17 Javascript
Jquery动态改变图片IMG的src地址示例
2013/06/25 Javascript
优化Node.js Web应用运行速度的10个技巧
2014/09/03 Javascript
Egret引擎开发指南之视觉编程
2014/09/03 Javascript
浅谈JavaScript超时调用和间歇调用
2015/08/30 Javascript
javascript中的3种继承实现方法
2016/01/27 Javascript
js改变style样式和css样式的简单实例
2016/06/28 Javascript
Vue底层实现原理总结
2018/02/17 Javascript
vue-router3.0版本中 router.push 不能刷新页面的问题
2018/05/10 Javascript
angularJS开发注意事项
2018/05/26 Javascript
JavaScript之实现一个简单的Vue示例
2019/01/17 Javascript
countUp.js实现数字动态变化效果
2019/10/17 Javascript
JS浏览器BOM常见操作实例详解
2020/04/27 Javascript
Vue实现简单的跑马灯
2020/05/25 Javascript
python判断字符串是否纯数字的方法
2014/11/19 Python
python使用fork实现守护进程的方法
2017/11/16 Python
对Python捕获控制台输出流的方法详解
2019/01/07 Python
使用Python和Prometheus跟踪天气的使用方法
2019/05/06 Python
解决Python安装时报缺少DLL问题【两种解决方法】
2019/07/15 Python
使用python处理题库表格并转化为word形式的实现
2020/04/14 Python
Python第三方包PrettyTable安装及用法解析
2020/07/08 Python
美国农场鲜花速递:The Bouqs
2018/07/13 全球购物
泰国健康和美容服务预订网站:GoWabi
2019/06/03 全球购物
以太网Ethernet IEEE802.3
2013/08/05 面试题
运动会演讲稿
2014/05/07 职场文书
单位委托书怎么写
2014/09/21 职场文书
12.4法制宣传日标语
2014/10/08 职场文书
经典法律座右铭(50句)
2019/08/15 职场文书
python 调用js的四种方式
2021/04/11 Python