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中as用法实例分析
Apr 30 Python
python中的全局变量用法分析
Jun 09 Python
Python实现文件复制删除
Apr 19 Python
python 自动化将markdown文件转成html文件的方法
Sep 23 Python
简单了解python模块概念
Jan 11 Python
Python实现钉钉发送报警消息的方法
Feb 20 Python
numpy实现神经网络反向传播算法的步骤
Dec 24 Python
Python中常用的高阶函数实例详解
Feb 21 Python
django项目中新增app的2种实现方法
Apr 01 Python
calendar在python3时间中常用函数举例详解
Nov 18 Python
Python爬虫之自动爬取某车之家各车销售数据
Jun 02 Python
python机器学习Github已达8.9Kstars模型解释器LIME
Nov 23 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
浅谈电磁辐射对健康的影响
2021/03/01 无线电
php 图片上传类代码
2009/07/17 PHP
php 读取shell管道传输过来的内容
2010/03/01 PHP
PHP正则+Snoopy抓取框架实现的抓取淘宝店信誉功能实例
2017/05/17 PHP
扩展String功能方法
2006/09/22 Javascript
javascript小数计算出现近似值的解决办法
2010/02/06 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(jquery)
2014/11/16 Javascript
jQuery中hasClass()方法用法实例
2015/01/06 Javascript
javascript使用appendChild追加节点实例
2015/01/12 Javascript
浅谈Javascript实现继承的方法
2015/07/06 Javascript
需灵活掌握的Bootstrap预定义排版类 你精通吗?
2016/06/20 Javascript
js数字舍入误差以及解决方法(必看篇)
2017/02/28 Javascript
vue.js实现数据动态响应 Vue.set的简单应用
2017/06/15 Javascript
详解Vue微信授权登录前后端分离较为优雅的解决方案
2018/06/29 Javascript
Nodejs把接收图片base64格式保存为文件存储到服务器上
2018/09/26 NodeJs
Vue批量图片显示时遇到的路径被解析问题
2019/03/28 Javascript
js实现点赞效果
2020/03/16 Javascript
使用Python的Twisted框架编写简单的网络客户端
2015/04/16 Python
Python matplotlib绘图可视化知识点整理(小结)
2018/03/16 Python
Django 重写用户模型的实现
2019/07/29 Python
python2爬取百度贴吧指定关键字和图片代码实例
2019/08/14 Python
Python 实现Image和Ndarray互相转换
2020/02/19 Python
Python抓包程序mitmproxy安装和使用过程图解
2020/03/02 Python
Python工程师必考的6个经典面试题
2020/06/28 Python
HTML5全屏(Fullscreen)API详细介绍
2015/04/24 HTML / CSS
Html5元素及基本语法详解
2016/08/02 HTML / CSS
什么造成了Java里面的异常
2016/04/24 面试题
Ejb技术面试题
2015/04/29 面试题
失业者真诚求职信范文
2013/12/25 职场文书
户外活动总结范文
2014/04/30 职场文书
企业职业病防治方案
2014/05/29 职场文书
初中差生评语
2014/12/29 职场文书
酒店财务总监岗位职责
2015/04/03 职场文书
不服劳动仲裁起诉书
2015/05/20 职场文书
python读取pdf格式文档的实现代码
2021/04/01 Python
基于Android10渲染Surface的创建过程
2022/08/14 Java/Android