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处理文本文件并生成指定格式的文件
Jul 31 Python
python实现备份目录的方法
Aug 03 Python
python套接字流重定向实例汇总
Mar 03 Python
python如何在终端里面显示一张图片
Aug 17 Python
基于Python socket的端口扫描程序实例代码
Feb 09 Python
Python实现抓取HTML网页并以PDF文件形式保存的方法
May 08 Python
如何使用pyinstaller打包32位的exe程序
May 26 Python
python自定义时钟类、定时任务类
Feb 22 Python
Django发送邮件功能实例详解
Sep 02 Python
Python集合操作方法详解
Feb 09 Python
python数字类型math库原理解析
Mar 02 Python
python 获取字典键值对的实现
Nov 12 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
重置版游戏视频
2020/04/09 魔兽争霸
利用PHP命令行模式采集股票趋势信息
2016/08/09 PHP
PHP 7.1新特性的汇总介绍
2016/12/16 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
JAVASCRIPT keycode总结
2009/02/04 Javascript
JS中typeof与instanceof之间的区别总结
2013/11/14 Javascript
jquery选择器中的空格与大于号>、加号+与波浪号~的区别介绍
2016/06/24 Javascript
JavaScript第一篇之实现按钮全选、功能
2016/08/21 Javascript
nodejs读写json文件的简单方法(必看)
2017/03/09 NodeJs
JavaScript对JSON数据进行排序和搜索
2017/07/24 Javascript
详解基于 axios 的 Vue 项目 http 请求优化
2017/09/04 Javascript
Angular CLI 安装和使用教程
2017/09/13 Javascript
webpack将js打包后的map文件详解
2018/02/22 Javascript
JavaScript对象的浅拷贝与深拷贝实例分析
2018/07/25 Javascript
微信小程序之多列表的显示和隐藏功能【附源码】
2018/08/06 Javascript
Angular使用Restful的增删改
2018/12/28 Javascript
迅速了解一下ES10中Object.fromEntries的用法使用
2019/03/05 Javascript
浅谈react-router@4.0 使用方法和源码分析
2019/06/04 Javascript
基于Node的Axure文件在线预览的实现代码
2019/08/28 Javascript
vue使用i18n实现国际化的方法详解
2019/09/05 Javascript
浅析js实现网页截图的两种方式
2019/11/01 Javascript
Python写的Discuz7.2版faq.php注入漏洞工具
2014/08/06 Python
python append、extend与insert的区别
2016/10/13 Python
selenium 多窗口切换的实现(windows)
2020/01/18 Python
Python使用socket_TCP实现小文件下载功能
2020/10/09 Python
使用 HTML5 Canvas 制作水波纹效果点击图片就会触发
2014/09/15 HTML / CSS
类、抽象类、接口的差异
2016/06/13 面试题
《小猫刮胡子》教学反思
2014/02/21 职场文书
作风建设年活动实施方案
2014/10/24 职场文书
感谢信范文大全
2015/01/23 职场文书
库房管理员岗位职责
2015/02/12 职场文书
实习班主任自我评价
2015/03/11 职场文书
邓小平文选读书笔记
2015/06/29 职场文书
公司仓库管理制度
2015/08/04 职场文书
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
2021/05/17 Python
Spring Data JPA框架自定义Repository接口
2022/04/28 Java/Android