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实现合并两个数组的方法
May 16 Python
Python Property属性的2种用法
Jun 21 Python
python模块之re正则表达式详解
Feb 03 Python
用Python删除本地目录下某一时间点之前创建的所有文件的实例
Dec 14 Python
python判断输入日期为第几天的实例
Nov 13 Python
浅谈Python中的可迭代对象、迭代器、For循环工作机制、生成器
Mar 11 Python
Python音频操作工具PyAudio上手教程详解
Jun 26 Python
Flask框架学习笔记之使用Flask实现表单开发详解
Aug 12 Python
使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)
Jan 18 Python
详解pandas中iloc, loc和ix的区别和联系
Mar 09 Python
python中xlrd模块的使用详解
Feb 01 Python
如何用Python和JS实现的Web SSH工具
Feb 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中对2个数组相加的函数
2011/06/24 PHP
PHP生成随机数的方法实例分析
2015/01/22 PHP
学习php设计模式 php实现原型模式(prototype)
2015/12/07 PHP
PHP 7.1新特性的汇总介绍
2016/12/16 PHP
laravel5.6实现数值转换
2019/10/23 PHP
XMLHTTPRequest的属性和方法简介
2010/11/23 Javascript
jQuery 选择器、DOM操作、事件、动画
2010/11/25 Javascript
js整数字符串转换为金额类型数据(示例代码)
2013/12/26 Javascript
jquery中的on方法使用介绍
2013/12/29 Javascript
在myeclipse中如何加入jquery代码提示功能
2014/06/03 Javascript
jquery滚动到顶部底部代码
2015/04/20 Javascript
微信小程序本地缓存数据增删改查实例详解
2017/05/24 Javascript
微信小程序 页面滑动事件的实例详解
2017/10/12 Javascript
JavaScript中EventLoop介绍
2018/01/22 Javascript
微信小程序之分享页面如何返回首页的示例
2018/03/28 Javascript
vue点击input弹出带搜索键盘并监听该元素的方法
2018/08/25 Javascript
Vue批量图片显示时遇到的路径被解析问题
2019/03/28 Javascript
[52:37]完美世界DOTA2联赛循环赛 Forest vs DM BO2第一场 10.29
2020/10/29 DOTA
python实现的系统实用log类实例
2015/06/30 Python
详解Python中映射类型(字典)操作符的概念和使用
2015/08/19 Python
Python3实现对列表按元组指定列进行排序的方法分析
2018/12/22 Python
django模板结构优化的方法
2019/02/28 Python
python代理工具mitmproxy使用指南
2019/07/04 Python
如何在scrapy中集成selenium爬取网页的方法
2020/11/18 Python
利用纯html5绘制出来的一款非常漂亮的时钟
2015/01/04 HTML / CSS
Stuart Weitzman欧盟:美国奢华鞋履品牌
2017/05/24 全球购物
李维斯法国官网:Levi’s法国
2019/07/13 全球购物
MyBag中文网:英国著名的时尚包袋电商零售网站
2020/07/31 全球购物
介绍一下你对SOA的认识
2016/04/24 面试题
幼儿园新学期寄语
2014/01/18 职场文书
2014全国两会学习心得体会2000字
2014/03/10 职场文书
cf战队收人口号
2014/06/21 职场文书
快递员岗位职责
2014/09/12 职场文书
2019年行政人事个人工作总结范本!
2019/07/19 职场文书
Python包管理工具pip的15 个使用小技巧
2021/05/17 Python
Mysql中的触发器定义及语法介绍
2022/06/25 MySQL