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使用rabbitmq实现网络爬虫示例
Feb 20 Python
Python greenlet实现原理和使用示例
Sep 24 Python
浅谈Python中用datetime包进行对时间的一些操作
Jun 23 Python
python win32 简单操作方法
May 25 Python
动态规划之矩阵连乘问题Python实现方法
Nov 27 Python
Python实现的括号匹配判断功能示例
Aug 25 Python
在ubuntu16.04中将python3设置为默认的命令写法
Oct 31 Python
Python 限制线程的最大数量的方法(Semaphore)
Feb 22 Python
python进程的状态、创建及使用方法详解
Dec 06 Python
python求numpy中array按列非零元素的平均值案例
Jun 08 Python
几款Python编译器比较与推荐(小结)
Oct 15 Python
python在协程中增加任务实例操作
Feb 28 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
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
Jquery时间验证和转换工具小例子
2013/07/01 Javascript
AngularJS iframe跨域打开内容时报错误的解决办法
2015/01/26 Javascript
javascript图片延迟加载实现方法及思路
2015/12/31 Javascript
基于Echarts 3.19 制作常用的图形(非静态)
2016/05/19 Javascript
微信小程序 实现tabs选项卡效果实例代码
2016/10/31 Javascript
Bootstrap源码学习笔记之bootstrap进度条
2016/12/24 Javascript
jQuery验证表单格式的使用方法
2017/01/10 Javascript
详解使用vscode+es6写nodejs服务端调试配置
2017/09/21 NodeJs
详解Element-UI中上传的文件前端处理
2019/08/07 Javascript
深入理解 TypeScript Reflect Metadata
2019/12/12 Javascript
Nodejs + Websocket 指定发送及群聊的实现
2020/01/09 NodeJs
javascript将16进制的字符串转换为10进制整数hex
2020/03/05 Javascript
jQuery实现带进度条的轮播图
2020/09/13 jQuery
[01:44]Ti10举办地公布
2019/08/25 DOTA
跟老齐学Python之关于类的初步认识
2014/10/11 Python
Python的Flask框架中web表单的教程
2015/04/20 Python
浅谈机器学习需要的了解的十大算法
2017/12/15 Python
Django如何实现密码错误报错提醒
2020/09/04 Python
Window10上Tensorflow的安装(CPU和GPU版本)
2020/12/15 Python
video.js支持m3u8格式直播的实现示例
2020/05/20 HTML / CSS
H&M旗下高端女装品牌:& Other Stories
2018/05/07 全球购物
Melissa鞋英国官方网站:Nonnon
2019/05/01 全球购物
营业员个人总结的自我评价
2013/10/25 职场文书
办公室综合文员岗位职责范本
2014/02/13 职场文书
气象学专业个人求职信
2014/03/15 职场文书
《月球之谜》教学反思
2014/04/10 职场文书
安全教育月活动总结
2014/05/05 职场文书
语文复习计划
2015/01/19 职场文书
西湖英语导游词
2015/02/06 职场文书
2016感恩母亲节校园广播稿
2015/12/17 职场文书
导游词之吉林花园山
2019/10/17 职场文书
读《钢铁是怎样炼成的》有感:百炼方成钢
2019/11/05 职场文书
人工智能深度学习OpenAI baselines的使用方法
2022/05/20 Python
MySQL生成千万测试数据以及遇到的问题
2022/08/05 MySQL