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中使用PDB库调试程序
Apr 05 Python
为Python的web框架编写MVC配置来使其运行的教程
Apr 30 Python
Python下线程之间的共享和释放示例
May 04 Python
python 实现调用子文件下的模块方法
Dec 07 Python
解决pyttsx3无法封装的问题
Dec 24 Python
Python骚操作之动态定义函数
Mar 26 Python
django的ORM操作 删除和编辑实现详解
Jul 24 Python
Jupyter Notebook 实现正常显示中文和负号
Apr 24 Python
解决Python 写文件报错TypeError的问题
Oct 23 Python
利用python爬取有道词典的方法
Dec 08 Python
解决import tensorflow导致jupyter内核死亡的问题
Feb 06 Python
python 装饰器重要在哪
Feb 14 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
从网上搜到的phpwind 0day的代码
2006/12/07 PHP
加强版phplib的DB类
2008/03/31 PHP
PHP用SAX解析XML的实现代码与问题分析
2011/08/22 PHP
php实现scws中文分词搜索的方法
2015/12/25 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
jQuery中Form相关知识汇总
2015/01/06 Javascript
JS实现图片放大镜效果的方法
2015/02/27 Javascript
jQuery实现的鼠标经过时变宽的效果(附demo源码)
2016/04/28 Javascript
基于JavaScript实现的顺序查找算法示例
2017/04/14 Javascript
基于js 各种排序方法和sort方法的区别(详解)
2018/01/03 Javascript
React路由管理之React Router总结
2018/05/10 Javascript
几个你不知道的技巧助你写出更优雅的vue.js代码
2018/06/11 Javascript
详解从NodeJS搭建中间层再谈前后端分离
2018/11/13 NodeJs
Vue核心概念Getter的使用方法
2019/01/18 Javascript
微信小程序顶部导航栏滑动tab效果
2019/01/28 Javascript
layer实现登录弹框,登录成功后关闭弹框并调用父窗口的例子
2019/09/11 Javascript
JavaScript监听触摸事件代码实例
2019/12/30 Javascript
在Linux下使用Python的matplotlib绘制数据图的教程
2015/06/11 Python
Python3多进程 multiprocessing 模块实例详解
2018/06/11 Python
python中itertools模块zip_longest函数详解
2018/06/12 Python
Django组件之cookie与session的使用方法
2019/01/10 Python
Python3实现的判断回文链表算法示例
2019/03/08 Python
Django如何使用第三方服务发送电子邮件
2019/08/14 Python
关于pycharm中pip版本10.0无法使用的解决办法
2019/10/10 Python
简单了解python数组的基本操作
2019/11/26 Python
python使用正则表达式匹配txt特定字符串(有换行)
2020/12/09 Python
利用HTML5实现使用按钮控制背景音乐开关
2015/09/21 HTML / CSS
微软俄罗斯官方网站:Microsoft俄罗斯
2016/09/18 全球购物
巴西备受欢迎的服装和生活方式品牌:FARM Rio
2020/02/04 全球购物
师范毕业生求职自荐信
2013/09/25 职场文书
《雕塑之美》教学反思
2014/04/24 职场文书
学校综治宣传月活动总结
2014/07/02 职场文书
暑期辅导班宣传单
2015/07/14 职场文书
小学运动会入场口号
2015/12/24 职场文书
手把手带你彻底卸载MySQL数据库
2022/06/14 MySQL
蓝牙耳机怎么连接电脑win11? Win11蓝牙耳机连接电脑的技巧
2023/01/09 数码科技