在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 连连看连接算法
Nov 22 Python
Python中使用 Selenium 实现网页截图实例
Jul 18 Python
python实现连接mongodb的方法
May 08 Python
Python自动发邮件脚本
Mar 31 Python
CentOS 7下安装Python 3.5并与Python2.7兼容并存详解
Jul 07 Python
Python实现两个list求交集,并集,差集的方法示例
Aug 02 Python
django使用django-apscheduler 实现定时任务的例子
Jul 20 Python
详解Django 时间与时区设置问题
Jul 23 Python
Python操作Mongodb数据库的方法小结
Sep 10 Python
基于python实现FTP文件上传与下载操作(ftp&sftp协议)
Apr 01 Python
基于Python和C++实现删除链表的节点
Jul 06 Python
opencv实现图像平移效果
Mar 24 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实时显示输出
2008/10/02 PHP
php采用curl访问域名返回405 method not allowed提示的解决方法
2014/06/26 PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
2019/07/22 PHP
基于Jquery的淡入淡出的特效基础练习
2010/12/13 Javascript
JS中的异常处理方法分享
2013/12/22 Javascript
js检测网络是否具体连接功能的代码
2014/05/23 Javascript
js+HTML5实现canvas多种颜色渐变效果的方法
2015/06/05 Javascript
jQuery如何使用自动触发事件trigger
2015/11/29 Javascript
jQuery学习笔记之入门
2016/12/14 Javascript
layui中table表头样式修改方法
2018/08/15 Javascript
详解Node.js读写中文内容文件操作
2018/10/10 Javascript
React如何解决fetch跨域请求时session失效问题
2018/11/02 Javascript
JS合并两个数组的3种方法详解
2019/10/24 Javascript
修改Vue打包后的默认文件名操作
2020/08/12 Javascript
[01:06:12]VP vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python的tkinter布局之简单的聊天窗口实现方法
2014/09/03 Python
Python进阶篇之字典操作总结
2016/11/16 Python
对python 合并 累加两个dict的实例详解
2019/01/21 Python
对Python 获取类的成员变量及临时变量的方法详解
2019/01/22 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
2019/06/18 Python
python中树与树的表示知识点总结
2019/09/14 Python
Python实现语音识别和语音合成功能
2019/09/20 Python
详解Python3定时器任务代码
2019/09/23 Python
浅谈Django2.0 加xadmin踩的坑
2019/11/15 Python
Pytorch提取模型特征向量保存至csv的例子
2020/01/03 Python
Python 基于FIR实现Hilbert滤波器求信号包络详解
2020/02/26 Python
Django celery异步任务实现代码示例
2020/11/26 Python
跑步爱好者一站式服务网站:Jack Rabbit
2016/09/01 全球购物
佛罗里达州印第安河新鲜水果:Hale Groves
2017/02/20 全球购物
日本乐天官方海外转运服务:Rakuten Global Express
2018/11/30 全球购物
介绍一下常见的木马种类
2014/11/15 面试题
百日安全活动总结
2014/05/04 职场文书
公司年底活动方案
2014/08/17 职场文书
2014年教师节演讲稿
2014/09/03 职场文书
领导个人查摆剖析材料
2014/10/29 职场文书
公司人力资源管理制度
2015/08/05 职场文书