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 相关文章推荐
Django中实现一个高性能计数器(Counter)实例
Jul 09 Python
使用Python的Twisted框架构建非阻塞下载程序的实例教程
May 25 Python
Python实现读取及写入csv文件的方法示例
Jan 12 Python
Python OOP类中的几种函数或方法总结
Feb 22 Python
使用pyshp包进行shapefile文件修改的例子
Dec 06 Python
python怎么自定义捕获错误
Jun 29 Python
python 识别登录验证码图片功能的实现代码(完整代码)
Jul 03 Python
Python抓包并解析json爬虫的完整实例代码
Nov 03 Python
Python偏函数实现原理及应用
Nov 20 Python
用python批量移动文件
Jan 14 Python
pyqt5打包成exe可执行文件的方法
May 14 Python
Python sklearn分类决策树方法详解
Sep 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
PHP json_encode() 函数详解及中文乱码问题
2015/11/05 PHP
一段利用WSH获取登录时间的jscript代码
2008/05/11 Javascript
jQuery 剧场版 你必须知道的javascript
2009/05/27 Javascript
jquery.validate使用攻略 第一部
2010/07/01 Javascript
js的[defer]和[async]属性
2014/11/24 Javascript
举例讲解AngularJS中的模块
2015/06/17 Javascript
jQuery Real Person验证码插件防止表单自动提交
2015/11/06 Javascript
浅谈javascript中的Function和Arguments
2016/08/30 Javascript
网站申请不到支付宝接口、微信接口,免接口收款实现方式几种解决办法
2016/12/14 Javascript
微信小程序 首页制作简单实例
2017/04/07 Javascript
AngularJS使用ng-class动态增减class样式的方法示例
2017/05/18 Javascript
超级简易的JS计算器实例讲解(实现加减乘除)
2017/08/08 Javascript
VUE前端cookie简单操作
2017/10/17 Javascript
javascript中的隐式调用
2018/02/10 Javascript
JS数组去重常用方法实例小结【4种方法】
2018/05/28 Javascript
微信小程序实现登录注册tab切换效果
2020/12/29 Javascript
vue.js实现的幻灯片功能示例
2019/01/18 Javascript
vue计算属性computed、事件、监听器watch的使用讲解
2019/01/21 Javascript
将Vue组件库更换为按需加载的方法步骤
2020/05/06 Javascript
JS 5种遍历对象的方式
2020/06/16 Javascript
jQuery实现开关灯效果
2020/08/02 jQuery
Python中的装饰器用法详解
2015/01/14 Python
Python实现身份证号码解析
2015/09/01 Python
探究python中open函数的使用
2016/03/01 Python
python负载均衡的简单实现方法
2018/02/04 Python
python解决pandas处理缺失值为空字符串的问题
2018/04/08 Python
python进行两个表格对比的方法
2018/06/27 Python
python科学计算之scipy——optimize用法
2019/11/25 Python
五分钟带你搞懂python 迭代器与生成器
2020/08/30 Python
Python开发入门——迭代的基本使用
2020/09/03 Python
Python3利用openpyxl读写Excel文件的方法实例
2021/02/03 Python
C#笔试题和英文面试题
2013/02/07 面试题
学雷锋献爱心活动总结
2015/05/11 职场文书
毕业论文致谢怎么写
2015/05/14 职场文书
2016年五一劳动节专题校园广播稿
2015/12/17 职场文书
mysql分组后合并显示一个字段的多条数据方式
2022/01/22 MySQL