在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中os操作文件及文件路径实例汇总
Jan 15 Python
Python的Flask框架的简介和安装方法
Nov 13 Python
python 循环遍历字典元素的简单方法
Sep 11 Python
Python中遇到的小问题及解决方法汇总
Jan 11 Python
python @property的用法及含义全面解析
Feb 01 Python
使用Python实现将list中的每一项的首字母大写
Jun 11 Python
Python 一行代码能实现丧心病狂的功能
Jan 18 Python
python解析xml文件方式(解析、更新、写入)
Mar 05 Python
Django url 路由匹配过程详解
Jan 22 Python
Jupyter notebook 不自动弹出网页的解决方案
May 21 Python
Python激活Anaconda环境变量的详细步骤
Jun 08 Python
用Python编写简单的gRPC服务的详细过程
Jul 04 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使用cookie实现记住登录状态
2015/04/27 PHP
php封装的连接Mysql类及用法分析
2015/12/10 PHP
laravel 框架执行流程与原理简单分析
2020/02/01 PHP
javascript 函数式编程
2007/08/16 Javascript
javascript web对话框与弹出窗口
2009/02/22 Javascript
不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象
2013/01/11 Javascript
Javascript 按位取反运算符 (~)
2014/02/04 Javascript
一个JavaScript处理textarea中的字符成每一行实例
2014/09/22 Javascript
javascript中in运算符用法分析
2015/04/28 Javascript
Javascript动画效果(4)
2016/10/11 Javascript
基于jQuery实现Tabs选项卡自定义插件
2016/11/21 Javascript
详解vue-cli 构建项目 vue-cli请求后台接口 vue-cli使用axios、sass、swiper
2018/05/28 Javascript
解决vue单页面修改样式无法覆盖问题
2019/08/05 Javascript
vue.js中ref和$refs的使用及示例讲解
2019/08/14 Javascript
JavaScript函数柯里化实现原理及过程
2020/12/02 Javascript
JavaScript如何实现防止重复的网络请求的示例
2021/01/28 Javascript
Python上下文管理器和with块详解
2017/09/09 Python
NumPy 如何生成多维数组的方法
2018/02/05 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
Python中的asyncio代码详解
2019/06/10 Python
Flask框架模板继承实现方法分析
2019/07/31 Python
python 实现快速生成连续、随机字母列表
2019/11/28 Python
pytorch 图像中的数据预处理和批标准化实例
2020/01/15 Python
html5如何在Canvas中实现自定义路径动画示例
2017/09/18 HTML / CSS
优衣库澳大利亚官网:UNIQLO澳大利亚
2017/01/18 全球购物
健康监测猫砂:Pretty Litter
2017/05/25 全球购物
NFL官方在线商店:NFLShop
2020/07/29 全球购物
端午节粽子促销活动方案
2014/02/02 职场文书
报关专员求职信范文
2014/02/22 职场文书
爱国主义教育演讲稿
2014/08/26 职场文书
交通局领导班子群众路线教育实践活动对照检查材料思想汇报
2014/10/09 职场文书
小学生2015教师节演讲稿
2015/03/19 职场文书
服务员岗位职责范本
2015/04/09 职场文书
python - asyncio异步编程
2021/04/06 Python
Django路由层如何获取正确的url
2021/07/15 Python
redis lua限流算法实现示例
2022/07/15 Redis