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操作MySQL数据库的方法分享
May 29 Python
在Python的循环体中使用else语句的方法
Mar 30 Python
Python实现的最近最少使用算法
Jul 10 Python
在Django的URLconf中使用命名组的方法
Jul 18 Python
使用Python神器对付12306变态验证码
Jan 05 Python
Python2/3中urllib库的一些常见用法
Dec 19 Python
python 脚本生成随机 字母 + 数字密码功能
May 26 Python
python的格式化输出(format,%)实例详解
Jun 01 Python
python实现定时发送qq消息
Jan 18 Python
Python字典对象实现原理详解
Jul 01 Python
Django实现WebSSH操作物理机或虚拟机的方法
Nov 06 Python
python如何读取和存储dict()与.json格式文件
Jun 25 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
Windows 下的 PHP-PEAR 安装方法
2010/11/20 PHP
PHP面向对象多态性实现方法简单示例
2017/09/27 PHP
jquery ajax中使用jsonp的限制解决方法
2013/11/22 Javascript
浅析jQuery1.8的几个小变化
2013/12/10 Javascript
JavaScript获取页面上被选中文字的方法技巧
2015/03/13 Javascript
JQuery ztree带筛选、异步加载实例讲解
2016/02/25 Javascript
JS表单验证的代码(常用)
2016/04/08 Javascript
动态的9*9乘法表效果的实现代码
2016/05/16 Javascript
js对字符串进行编码的方法总结(推荐)
2016/11/10 Javascript
Jquery鼠标放上去显示全名的实现方法
2017/02/06 Javascript
jQuery模拟淘宝购物车功能
2017/02/27 Javascript
自带气泡提示的vue校验插件(vue-verify-pop)
2017/04/07 Javascript
关于jquery form表单序列化的注意事项详解
2017/08/01 jQuery
移动端Ionic App 资讯上下循环滚动的实现代码(跑马灯效果)
2017/08/29 Javascript
jQuery中内容过滤器简单用法示例
2018/03/31 jQuery
基于vue cli 通过命令行传参实现多环境配置
2018/07/12 Javascript
axios对请求各种异常情况处理的封装方法
2018/09/25 Javascript
vue-cli3.0 环境变量与模式配置方法
2018/11/08 Javascript
关于vue组件事件属性穿透详解
2019/10/28 Javascript
[06:21]2014DOTA2国际邀请赛 庆祝VG首阶段领跑;B叔为挣牛排半夜整理情报
2014/07/13 DOTA
Python模拟脉冲星伪信号频率实例代码
2018/01/03 Python
Python AES加密实例解析
2018/01/18 Python
Python 循环语句之 while,for语句详解
2018/04/23 Python
Python玩转PDF的各种骚操作
2019/05/06 Python
Django 数据库同步操作技巧详解
2019/07/19 Python
Python 求数组局部最大值的实例
2019/11/26 Python
游戏商店:Eneba
2020/04/25 全球购物
在DELPHI中调用存储过程和使用内嵌SQL哪种方式更好
2016/11/22 面试题
中医临床专业自我鉴定范文
2014/01/15 职场文书
艺校音乐专业自我鉴定范文
2014/03/01 职场文书
中班下学期个人总结
2015/02/12 职场文书
劳保用品管理制度范本
2015/08/06 职场文书
python中的class_static的@classmethod的巧妙用法
2021/06/22 Python
详解JSON.parse和JSON.stringify用法
2022/02/18 Javascript
我国拿下天问一号火星着陆区附近 22 个地理实体命名:平乐、西柏坡、古田、漠河等
2022/04/29 数码科技
Java实现扫雷游戏详细代码讲解
2022/05/25 Java/Android