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 相关文章推荐
wxPython学习之主框架实例
Sep 28 Python
在Python的列表中利用remove()方法删除元素的教程
May 21 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
Oct 25 Python
python求最大连续子数组的和
Jul 07 Python
Python使用post及get方式提交数据的实例
Jan 24 Python
python用opencv批量截取图像指定区域的方法
Jan 24 Python
Python考拉兹猜想输出序列代码实践
Jul 05 Python
python随机生成大小写字母数字混合密码(仅20行代码)
Feb 01 Python
python连接打印机实现打印文档、图片、pdf文件等功能
Feb 07 Python
基于Python获取docx/doc文件内容代码解析
Feb 17 Python
python实现全排列代码(回溯、深度优先搜索)
Feb 26 Python
五分钟带你搞懂python 迭代器与生成器
Aug 30 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另类上传图片的方法(PHP用Socket上传图片)
2013/10/30 PHP
phpmailer中文乱码问题的解决方法
2014/04/22 PHP
php在数据库抽象层简单使用PDO的方法
2015/11/03 PHP
jqGrid增加时--判断开始日期与结束日期(实例解析)
2013/11/08 Javascript
JS关闭窗口与JS关闭页面的几种方法小结
2013/12/17 Javascript
jQuery多媒体插件jQuery Media Plugin使用详解
2014/12/19 Javascript
2种jQuery 实现刮刮卡效果
2015/02/01 Javascript
jquery插件corner实现圆角边框的方法
2015/03/09 Javascript
javascript中$(function() {});写与不写有哪些区别
2015/08/10 Javascript
JQuery实现简单的图片滑动切换特效
2015/11/22 Javascript
Flow之一个新的Javascript静态类型检查器
2015/12/21 Javascript
js跨域资源共享 基础篇
2016/07/02 Javascript
Bootstrap导航条鼠标悬停下拉菜单
2017/01/04 Javascript
jQuery学习之DOM节点的插入方法总结
2017/01/22 Javascript
数组Array的排序sort方法
2017/02/17 Javascript
详解vue与后端数据交互(ajax):vue-resource
2017/03/16 Javascript
原生js实现简单的模态框示例
2017/09/08 Javascript
深入浅析ES6 Class 中的 super 关键字
2017/10/20 Javascript
JS基于递归实现网页版计算器的方法分析
2017/12/20 Javascript
13 个npm 快速开发技巧(推荐)
2019/07/04 Javascript
JS用最简单的方法实现四舍五入
2019/08/27 Javascript
JS实现碰撞检测效果
2020/03/12 Javascript
[45:25]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.22
2019/09/05 DOTA
python使用calendar输出指定年份全年日历的方法
2015/04/04 Python
python numpy元素的区间查找方法
2018/11/14 Python
django连接oracle时setting 配置方法
2019/08/29 Python
Pycharm配置PyQt5环境的教程
2020/04/02 Python
IE支持HTML5的解决方法
2009/10/20 HTML / CSS
HTML5 虚拟键盘出现挡住输入框的解决办法
2017/02/14 HTML / CSS
英国家用电器折扣网站:Electrical Discount UK
2018/09/17 全球购物
函授大专自我鉴定
2013/11/01 职场文书
协议书范本
2014/04/23 职场文书
公安局班子个人对照检查材料思想汇报
2014/10/09 职场文书
父亲节寄语大全
2015/02/27 职场文书
十大最强水系宝可梦,最美宝可梦排第三,榜首大家最熟悉
2022/03/18 日漫
html解决浏览器记住密码输入框的问题
2023/05/07 HTML / CSS