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的基本方法
Jul 29 Python
selenium + python 获取table数据的示例讲解
Oct 13 Python
Python UnboundLocalError和NameError错误根源案例解析
Oct 31 Python
Python 硬币兑换问题
Jul 29 Python
python框架django项目部署相关知识详解
Nov 04 Python
使用Python完成15位18位身份证的互转功能
Nov 06 Python
有关Tensorflow梯度下降常用的优化方法分享
Feb 04 Python
python turtle工具绘制四叶草的实例分享
Feb 14 Python
Django多数据库联用实现方法解析
Nov 12 Python
Pandas中DataFrame交换列顺序的方法实现
Dec 14 Python
如何用 Python 制作 GitHub 消息助手
Feb 20 Python
详解用Python把PDF转为Word方法总结
Apr 27 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初学入门
2006/11/19 PHP
Zend Framework教程之Bootstrap类用法概述
2016/03/14 PHP
JavaScript的面向对象(二)
2006/11/09 Javascript
js获取提交的字符串的字节数
2009/02/09 Javascript
Js 获取HTML DOM节点元素的方法小结
2009/04/24 Javascript
JavaScript 新手24条实用建议[TUTS+]
2009/06/21 Javascript
基于jQuery的投票系统显示结果插件
2011/08/12 Javascript
jQuery解析与处理服务器端返回xml格式数据的方法详解
2016/07/04 Javascript
D3.js实现柱状图的方法详解
2016/09/21 Javascript
Boostrap实现的登录界面实例代码
2016/10/09 Javascript
Bootstrap基本插件学习笔记之模态对话框(16)
2016/12/08 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
2016/12/22 Javascript
整理关于Bootstrap排版的慕课笔记
2017/03/29 Javascript
微信JS SDK接入的几点注意事项(必看篇)
2017/06/23 Javascript
VUE实现表单元素双向绑定(总结)
2017/08/08 Javascript
使用jQuery实现简单的tab框实例
2017/08/22 jQuery
详解react服务端渲染(同构)的方法
2017/09/21 Javascript
bootstrap下拉分页样式 带跳转页码
2018/12/29 Javascript
Node 模块原理与用法详解
2020/05/13 Javascript
javascript实现搜索筛选功能实例代码
2020/11/12 Javascript
Nodejs 数组的队列以及forEach的应用详解
2021/02/25 NodeJs
python django事务transaction源码分析详解
2017/03/17 Python
Python网络爬虫与信息提取(实例讲解)
2017/08/29 Python
Python使用wget实现下载网络文件功能示例
2018/05/31 Python
python爬虫框架scrapy实现模拟登录操作示例
2018/08/02 Python
装饰资料员岗位职责
2013/12/30 职场文书
自我评价的范文
2014/02/02 职场文书
《桂林山水》教学反思
2014/02/08 职场文书
迎元旦广播稿
2014/02/22 职场文书
生物科学专业毕业生求职信
2014/06/02 职场文书
幼儿园标语大全
2014/06/19 职场文书
酒店管理专业毕业生自我鉴定
2014/09/29 职场文书
2015年国庆节寄语
2015/08/17 职场文书
python绘图subplots函数使用模板的示例代码
2021/04/30 Python
在CSS中使用when/else的方法
2022/01/18 HTML / CSS
基于PyQT5制作一个桌面摸鱼工具
2022/02/15 Python