Django如何防止定时任务并发浅析

 更新时间:2019年05月14日 08:35:28   作者:鱼儿  
这篇文章主要给大家介绍了关于Django如何防止定时任务并发的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Django具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

前言

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使用urllib2模块抓取HTML页面资源的实例分享

    Python使用urllib2模块抓取HTML页面资源的实例分享

    这篇文章主要介绍了Python使用urllib2模块抓取HTML页面资源的实例分享,将要抓取的页面地址写在单独的规则列表中方便组织和重复使用,需要的朋友可以参考下
    2016-05-05
  • 在Python的Django框架中实现Hacker News的一些功能

    在Python的Django框架中实现Hacker News的一些功能

    这篇文章主要介绍了在Python的Django框架中实现Hacker News的一些功能,包括投票“顶”评论等功能,需要的朋友可以参考下
    2015-04-04
  • 压缩包密码破解示例分享(类似典破解)

    压缩包密码破解示例分享(类似典破解)

    有一个压缩包密码忘了,写了一个小脚本实现一个解密的功能,输入自己常用密码中的单词后,脚本将这些密码组合尝试解压压缩包
    2014-01-01
  • 浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)

    浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)

    浏览器常用基本操作有很多种,今天给大家介绍python3+selenium4自动化测试的操作方法,是最最基础的一篇,对python3 selenium4自动化测试相关知识感兴趣的朋友一起看看吧
    2021-05-05
  • python Dataframe字符串合并的操作方法

    python Dataframe字符串合并的操作方法

    Dataframe的字符串合并包括2种场景,1.合并df中其中几列字符串;2.将df中的字符串与外部字符串合并,本文主要介绍在Python下对Dataframe进行字符串合并操作的方法,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • python中if的基础用法(if else和if not)

    python中if的基础用法(if else和if not)

    if在Python中用作某个条件或值的判断,下面这篇文章主要给大家介绍了关于python中if的基础用法,主要包括if else和if not,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • 使用Python来批量检测并删除Word文档中的宏

    使用Python来批量检测并删除Word文档中的宏

    Word文档作为最常用的电子文档格式之一,经常被用来作为内容分享工具,在网络中或设备之间进行传输,其安全性也需要受到关注,宏是可嵌入Word文档中的一种VBA迷你程序,本文将介绍如何使用Python来批量检测并删除Word文档中的宏,保护计算机的安全,需要的朋友可以参考下
    2024-07-07
  • Python入门教程1. 基本运算【四则运算、变量、math模块等】

    Python入门教程1. 基本运算【四则运算、变量、math模块等】

    这篇文章主要介绍了Python教程的基本运算,包括四则运算、变量的使用与类型检测、math模块等,并附带了相关说明,代码备有较为详尽的说明,便于理解,需要的朋友可以参考下
    2018-10-10
  • Python使用sorted排序的方法小结

    Python使用sorted排序的方法小结

    这篇文章主要介绍了Python使用sorted排序的方法,结合三个实例分析了Python使用sorted方法进行元素排序操作的相关实现技巧,需要的朋友可以参考下
    2017-07-07
  • python绘制热力图heatmap

    python绘制热力图heatmap

    这篇文章主要为大家详细介绍了python绘制热力图heatmap,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11

最新评论