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的Django框架实现事务交易管理的教程
Apr 20 Python
Python字典数据对象拆分的简单实现方法
Dec 05 Python
微信跳一跳python辅助脚本(总结)
Jan 11 Python
Python实现Kmeans聚类算法
Jun 10 Python
Windows下anaconda安装第三方包的方法小结(tensorflow、gensim为例)
Apr 05 Python
对tf.reduce_sum tensorflow维度上的操作详解
Jul 26 Python
Python SMTP发送邮件遇到的一些问题及解决办法
Oct 24 Python
python调用百度地图WEB服务API获取地点对应坐标值
Jan 16 Python
python sorted函数的小练习及解答
Sep 18 Python
python3利用Axes3D库画3D模型图
Mar 25 Python
Django如何批量创建Model
Sep 01 Python
python使用requests库爬取拉勾网招聘信息的实现
Nov 20 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 - Html Transfer Code
2006/10/09 PHP
php 攻击方法之谈php+mysql注射语句构造
2009/10/30 PHP
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
不重新编译PHP为php增加openssl模块的方法
2011/06/14 PHP
可以保证单词完整性的PHP英文字符串截取代码分享
2014/07/15 PHP
基于GD2图形库的PHP生成图片缩略图类代码分享
2015/02/08 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
仿jQuery的siblings效果的js代码
2011/08/09 Javascript
jQuery.validate 常用方法及需要注意的问题
2013/03/20 Javascript
javascript修改IMG标签的src问题
2014/03/28 Javascript
在JavaScript中处理时间之getHours()方法的使用
2015/06/10 Javascript
PHP结合jQuery实现红蓝投票功能特效
2015/07/22 Javascript
jQuery中ScrollTo用法示例
2016/09/04 Javascript
JS实现类似百叶窗下拉菜单效果
2016/12/30 Javascript
微信小程序用户自定义模版用法实例分析
2017/11/28 Javascript
nodejs连接mysql数据库及基本知识点详解
2018/03/20 NodeJs
详解在React里使用"Vuex"
2018/04/02 Javascript
webpack中的热刷新与热加载的区别
2018/04/09 Javascript
vue 双向数据绑定的实现学习之监听器的实现方法
2018/11/30 Javascript
教你使用vue-cli快速构建的小说阅读器
2019/05/13 Javascript
JavaScript模块管理的简单实现方式详解
2019/06/15 Javascript
vue+iview实现文件上传
2020/11/17 Vue.js
python写日志封装类实例
2015/06/28 Python
Python中条件判断语句的简单使用方法
2015/08/21 Python
Python模拟百度登录实例详解
2016/01/20 Python
Python使用爬虫猜密码
2016/02/19 Python
python采集百度搜索结果带有特定URL的链接代码实例
2019/08/30 Python
Python执行时间的几种计算方法
2020/07/31 Python
屈臣氏泰国官网:Watsons TH
2021/02/23 全球购物
五年级英语教学反思
2014/01/31 职场文书
授权委托书格式
2014/07/31 职场文书
2014年班组建设工作总结
2014/12/01 职场文书
2015年社区民政工作总结
2015/04/21 职场文书
2015年农村党员公开承诺事项
2015/04/28 职场文书
一文搞懂php的垃圾回收机制
2021/06/18 PHP