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模块学习 re 正则表达式
May 19 Python
Python读写Redis数据库操作示例
Mar 18 Python
用Python实现一个简单的能够上传下载的HTTP服务器
May 05 Python
栈和队列数据结构的基本概念及其相关的Python实现
Aug 24 Python
使用Python对SQLite数据库操作
Apr 06 Python
matplotlib 纵坐标轴显示数据值的实例
May 25 Python
python selenium执行所有测试用例并生成报告的方法
Feb 13 Python
初探利用Python进行图文识别(OCR)
Feb 26 Python
解决Pycharm 导入其他文件夹源码的2种方法
Feb 12 Python
使用python实现飞机大战游戏
Mar 23 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
May 15 Python
python 读取yaml文件的两种方法(在unittest中使用)
Dec 01 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自动适应范围的分页代码
2008/08/05 PHP
php 缩略图实现函数代码
2011/06/23 PHP
显示程序执行时间php函数代码
2013/08/29 PHP
PHP中SimpleXML函数用法分析
2014/11/26 PHP
yii实现使用CUploadedFile上传文件的方法
2015/12/28 PHP
用js实现手把手教你月入万刀(转贴)
2007/11/07 Javascript
基于JQuery 的消息提示框效果代码
2011/07/31 Javascript
文本框只能选择数据到文本框禁止手动输入
2013/11/22 Javascript
jQuery操作select下拉框的text值和value值的方法
2014/05/31 Javascript
Bootstrap每天必学之轮播(Carousel)插件
2016/04/25 Javascript
JS控制文本域只读或可写属性的方法
2016/06/24 Javascript
JS中使用FormData上传文件、图片的方法
2016/08/07 Javascript
OkHttp踩坑随笔为何 response.body().string() 只能调用一次
2018/01/08 Javascript
JavaScript 五大常见函数
2018/03/23 Javascript
详解js的视频和音频采集
2018/08/09 Javascript
d3绘制基本的柱形图的实现代码
2018/12/12 Javascript
[01:05:40]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第三场
2014/05/24 DOTA
[01:10:49]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
phpsir 开发 一个检测百度关键字网站排名的python 程序
2009/09/17 Python
python检查字符串是否是正确ISBN的方法
2015/07/11 Python
python多任务及返回值的处理方法
2019/01/22 Python
Python代码实现http/https代理服务器的脚本
2019/08/12 Python
关于pandas的离散化,面元划分详解
2019/11/22 Python
Python常用模块函数代码汇总解析
2020/08/31 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
2021/03/04 Python
浅谈CSS3动画的回调处理
2016/07/21 HTML / CSS
北美主要的汽车零部件零售商:AutoShack.com
2019/02/23 全球购物
美国林业供应商:Forestry Suppliers
2019/05/01 全球购物
瑞士最大的图书贸易公司:Orell Füssli
2019/12/28 全球购物
ORACLE十问
2015/04/20 面试题
经贸日语毕业生自荐信
2013/11/03 职场文书
给老师的检讨书
2014/02/11 职场文书
减负增效提质方案
2014/05/23 职场文书
上海世博会志愿者口号
2014/06/17 职场文书
Redis集群新增、删除节点以及动态增加内存的方法
2021/09/04 Redis
SpringBoot整合Minio文件存储
2022/04/03 Java/Android