Django如何防止定时任务并发浅析


Posted in Python onMay 14, 2019

前言

django提供了commands类,允许我们编写命令行脚本,并且可以通过python manage.py拉起。

了解commands

具体django commands如何使用,大家参考官方文档即可:https://docs.djangoproject.com/en/2.2/howto/custom-management-commands/

一个坑

使用时遇到一个坑:在commands运行中的异常并不会打印到屏幕上,它要求我们必须抛出CommandError类型的异常才能被打印到屏幕中,具体参考:https://docs.djangoproject.com/en/2.2/howto/custom-management-commands/#command-exceptions

文件锁防并发

我们通常利用Crontab拉起定时任务,那么就会面临一个常见问题,如何避免前一次没结束而后一次再次启动的问题。

通常都是用文件锁来搞定这个事情,我做了一个简单的装饰器来包装Commands的handle方法,定义一套元类或者类装饰器都可以达到同样的目的,这里就不炫技了。

# -*- coding: utf-8 -*-
import fcntl
import os
from apps.settings import CRON_LOCK_DIR


# 尝试加锁
def try_lock(name):
  def decorator(func):
    def wrap(*args, **kwargs):
      os.makedirs(CRON_LOCK_DIR, exist_ok=True)
      with open('{}/{}'.format(CRON_LOCK_DIR, name), 'w') as fd:
        try:
          fcntl.lockf(fd, fcntl.LOCK_EX | fcntl.LOCK_NB) # 加锁
          func(*args, **kwargs)
          fcntl.lockf(fd, fcntl.LOCK_UN) # 解锁
        except: # 加锁异常跳过
          pass
    return wrap
  return decorator

其中CRON_LOCK_DIR是文件锁的父目录,下面放了若干锁文件。

对Commands的handle方法指定锁文件名即可:

class Command(BaseCommand):
  @try_lock('check_order') # 指定锁文件的名字
  def handle(self, *args, **options):
    pass

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python写的贪吃蛇游戏例子
Jun 16 Python
在Python的Django框架中为代码添加注释的方法
Jul 16 Python
Python多维/嵌套字典数据无限遍历的实现
Nov 04 Python
对python过滤器和lambda函数的用法详解
Jan 21 Python
使用python的pexpect模块,实现远程免密登录的示例
Feb 14 Python
Python自动化之数据驱动让你的脚本简洁10倍【推荐】
Jun 04 Python
pandas计数 value_counts()的使用
Jun 24 Python
python flask搭建web应用教程
Nov 19 Python
python中使用you-get库批量在线下载bilibili视频的教程
Mar 10 Python
基于Python中random.sample()的替代方案
May 23 Python
windows+vscode安装paddleOCR运行环境的步骤
Nov 11 Python
Python趣味爬虫之用Python实现智慧校园一键评教
May 28 Python
python3 pygame实现接小球游戏
May 14 #Python
Django 多环境配置详解
May 14 #Python
python仿evething的文件搜索器实例代码
May 13 #Python
python爬虫租房信息在地图上显示的方法
May 13 #Python
详解如何设置Python环境变量?
May 13 #Python
详解python运行三种方式
May 13 #Python
OpenCV图像颜色反转算法详解
May 13 #Python
You might like
用php来检测proxy
2006/10/09 PHP
使用php语句将数据库*.sql文件导入数据库
2014/05/05 PHP
PHP简单实现无限级分类的方法
2016/05/13 PHP
深入理解PHP之OpCode原理详解
2016/06/01 PHP
PHP微信刮刮卡 附微信接口
2016/07/22 PHP
PHP表单验证内容是否为空的实现代码
2016/11/14 PHP
PHP实现json_decode不转义中文的方法
2017/05/20 PHP
For循环中分号隔开的3部分的执行顺序探讨
2014/05/27 Javascript
Bootstarp风格的toggle效果分享
2016/02/23 Javascript
AJAX实现瀑布流触发分页与分页触发瀑布流的方法
2016/05/23 Javascript
JavaScript实现打开链接页面的方式汇总
2016/06/02 Javascript
js实现刷新页面后回到记录时滚动条的位置【两种方案可选】
2016/12/12 Javascript
vue中引入第三方字体文件的方法示例
2018/12/17 Javascript
vue组件之间通信方式实例总结【8种方式】
2019/02/22 Javascript
elementUI vue this.$confirm 和el-dialog 弹出框 移动 示例demo
2019/07/03 Javascript
jquery多级树形下拉菜单的实例代码
2019/07/09 jQuery
layui弹出框Tab选项卡的示例代码
2019/09/04 Javascript
JavaScript和TypeScript中的void的具体使用
2019/09/12 Javascript
JS页面获取 session 值,作用域和闭包学习笔记
2019/10/16 Javascript
Node登录权限验证token验证实现的方法示例
2020/05/25 Javascript
详解vue高级特性
2020/06/09 Javascript
Python多线程threading和multiprocessing模块实例解析
2018/01/29 Python
python 字典中文key处理,读取,比较方法
2018/07/06 Python
使用 Python 快速实现 HTTP 和 FTP 服务器的方法
2019/07/22 Python
Python 日志logging模块用法简单示例
2019/10/18 Python
html5指南-5.使用web storage存储键值对的数据
2013/01/07 HTML / CSS
全球领先的各类汽车配件零售商:Advance Auto Parts
2016/08/26 全球购物
.NET方向面试题
2014/11/20 面试题
医学生自我评价
2014/01/27 职场文书
食品安全工作实施方案
2014/03/26 职场文书
2014年班长个人工作总结
2014/11/14 职场文书
员工工作表现自我评价
2015/03/06 职场文书
全国劳模先进事迹材料(2016精选版)
2016/02/25 职场文书
2019年怎样才能撰写出优秀的自荐信
2019/03/25 职场文书
励志语录:时光飞逝,请学会珍惜所有的人和事
2020/01/16 职场文书
为什么mysql字段要使用NOT NULL
2021/05/13 MySQL