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中使用中文的方法
Feb 19 Python
Python实现获取某天是某个月中的第几周
Feb 11 Python
python中实现精确的浮点数运算详解
Nov 02 Python
Python变量赋值的秘密分享
Apr 03 Python
Python之pandas读写文件乱码的解决方法
Apr 20 Python
python 获取当天凌晨零点的时间戳方法
May 22 Python
windows下python 3.6.4安装配置图文教程
Aug 21 Python
详解django自定义中间件处理
Nov 21 Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
Aug 13 Python
Python语言编写智力问答小游戏功能
Oct 13 Python
详解Python中的文件操作
Jan 14 Python
Python字符串常规操作小结
Apr 03 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 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
2012/06/07 PHP
深入php函数file_get_contents超时处理的方法详解
2013/06/03 PHP
php中header跳转使用include包含解决参数丢失问题
2015/05/08 PHP
如何打开php的gd2库
2017/02/09 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
2019/03/07 PHP
基于jquery的多彩百分比 动态进度条 投票效果显示效果实现代码
2011/08/28 Javascript
有关JavaScript的10个怪癖和秘密分享
2011/08/28 Javascript
到处都是jQuery选择器的年代 不了解它们的性能,行吗
2012/06/18 Javascript
nodejs读取memcache示例分享
2014/01/02 NodeJs
21个JavaScript事件(Events)属性汇总
2014/12/02 Javascript
JavaSacript中charCodeAt()方法的使用详解
2015/06/05 Javascript
node.js调用C++开发的模块实例
2015/07/03 Javascript
js图片轮播特效代码分享
2015/09/07 Javascript
jQuery基础_入门必看知识点
2016/07/04 Javascript
jQuery实现鼠标跟随效果
2017/02/20 Javascript
vue-cli如何快速构建vue项目
2017/04/26 Javascript
微信小程序城市定位的实现实例(获取当前所在国家城市信息)
2017/05/17 Javascript
ReactNative列表ListView的用法
2017/08/02 Javascript
微信小程序实现选项卡效果
2018/11/06 Javascript
node.js express捕获全局异常的三种方法实例分析
2019/12/27 Javascript
vue 动态组件(component :is) 和 dom元素限制(is)用法说明
2020/09/04 Javascript
[01:03:50]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第二场 2月7日
2021/03/11 DOTA
Python中使用items()方法返回字典元素对的教程
2015/05/21 Python
Python实现按特定格式对文件进行读写的方法示例
2017/11/30 Python
dataframe设置两个条件取值的实例
2018/04/12 Python
8段用于数据清洗Python代码(小结)
2019/10/31 Python
Python插入Elasticsearch操作方法解析
2020/01/19 Python
openCV提取图像中的矩形区域
2020/07/21 Python
Python -m参数原理及使用方法解析
2020/08/21 Python
HTML5逐步分析实现拖放功能的方法
2020/09/30 HTML / CSS
违反工作纪律检讨书
2014/02/15 职场文书
安全生产专项整治方案
2014/05/06 职场文书
优秀员工推荐材料
2014/12/20 职场文书
幼儿园小班班务总结
2015/08/03 职场文书
js实现上传图片到服务器
2021/04/11 Javascript
浅谈Redis主从复制以及主从复制原理
2021/05/29 Redis