Django如何防止定时任务并发浅析
作者:鱼儿 发布时间:2021-10-23 01:09:54
标签: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
来源:https://yuerblog.cc/2019/05/13/django-防止定时任务并发/
0
投稿
猜你喜欢
- 目录输出算法操作封装的操作含时演化算符的分解QFT的分解总结概要输出算法操作首先介绍一个最基本的使用方法,就是使用ProjectQ来打印量子
- SQL Server 6.5作为面向中小型企业的网络数据库服务系统,提供了 与众多高级数据库管理器相同的运行性能,向传统的数据库厂商发起了强
- 本文介绍了pandas中的series数据类型详解,分享给大家,具体如下:import pandas as pdimport numpy a
- 本文介绍了Vue2 SSR 缓存 Api 数据,分享给大家,具体如下:1. 安装缓存依赖: lru-cachenpm install lru
- ?? 罪魁祸首一个常见的场景是在表格行内以el-popover的形式对行内信息进行一些业务操作。在表格分页10条、20条的情况下页面运行良好
- 先把要恢复的文件置于MS SQL里的DATA文件里,进入MS SQL主数据库服务器。 1.我们使用默认方式建立一个供恢复
- Pandas的apply函数概念(图解)实例1:怎样对数值按分组的归一化实例2:怎样取每个分组的TOPN数据来源:https://blog.
- 最近需要将csv文件转成DataFrame并以json的形式展示到前台,故需要用到Dataframe的to_json方法to_json方法默
- arange()类似于内置函数range(),通过指定开始值、终值和步长创建表示等差数列的一维数组,注意得到的结果数组不包含终值。linsp
- 为什么我把自己机子上的数据库备份文件往另一台机子上还原不成功?可能是你在Restore的对话框中选项不正确。Restore 有三个选项,分别
- 在开发django应用的过程中,使用开发者模式启动服务是特别方便的一件事,只需要 python manage.py runserver 就可
- 如下所示:<div id="app"><el-form :model="ruleForm2&
- 问题描述vscode中跨目录的模块调用远不如pycharm中的来的简单,在pycharm中即使是不同库文件夹中子函数也可以进行互相调用。而在
- 本文实例为大家分享了python3实现弹弹球小游戏的具体代码,供大家参考,具体内容如下from tkinter import *from t
- 一、前言其实,在开发过程中,虽然我们没有直接使用到描述符,但是它在底层却无时不刻地被使用到,例如以下这些:function、bound me
- 本文侧重于如何使用Python语言实现SIFT算法所有程序已打包:基于OpenCV-Python的SIFT算法的实现一、什么是SIFT算法
- 分区表的概念 分区致力于解决支持极大表和索引的关键问题。它采用他们分解成较小和易于管理的称为分区的片(piece)的方法。一旦分区被定义,S
- torch中tensor数据类型转换转换为float32类型:points = points.type(torch.float32)读取to
- 首先让我们看下 YUI 是如何处理的:var toObject = function(a) { var o = {
- 前言很多时候需要对自己模型进行性能评估,对于一些理论上面的知识我想基本不用说明太多,关于校验模型准确度的指标主要有混淆矩阵、准确率、精确率、