Django如何防止定时任务并发浅析
作者:鱼儿 时间:2021-10-23 01:09:54
前言
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-防止定时任务并发/
标签:django,定时,并发
0
投稿
猜你喜欢
微软建议的ASP性能优化28条守则(1)
2008-02-22 16:54:00
Python安全获取域管理员权限几种方式操作示例
2022-10-04 01:14:15
SQLServer XML查询快速入门(18句话)
2024-01-26 13:47:07
ASP.NET MVC使用区域(Area)功能
2024-06-05 09:25:04
Python栈的实现方法示例【列表、单链表】
2023-07-20 15:51:42
OAuth 2.0授权协议详解
2023-06-15 03:54:43
python时间日期操作方法实例小结
2021-03-13 11:01:45
Python中unittest用法实例
2023-09-02 13:13:45
如何区分MySQL的innodb_flush_log_at_trx_commit和sync_binlog
2024-01-19 19:38:30
python实现的正则表达式功能入门教程【经典】
2023-11-30 05:38:04
Python绘制三角函数图(sin\\cos\\tan)并标注特定范围的例子
2021-06-17 17:53:29
Python实现人脸识别
2022-10-01 06:06:24
github配置使用指南
2022-01-05 23:14:49
pandas 数据结构之Series的使用方法
2022-08-13 15:56:39
Python中pip工具的安装以及使用
2023-12-12 18:42:37
Python内置数据结构列表与元组示例详解
2021-08-17 21:28:14
科学与艺术兼顾的有效网页视觉设计
2007-09-18 18:03:00
通过Python爬虫代理IP快速增加博客阅读量
2023-08-17 16:17:55
一文教会你用python连接并简单操作SQLserver数据库
2024-01-17 14:11:34
这样写python注释让代码更加的优雅
2021-01-07 09:09:12