这篇文章主要介绍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
以上是“Django防止定时任务并发的案例”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注创新互联行业资讯频道!
本文名称:Django防止定时任务并发的案例-创新互联
文章出自:https://www.cdcxhl.com/article46/eoeeg.html
成都网站建设公司_创新互联,为您提供App设计、云服务器、企业网站制作、做网站、营销型网站建设、网站导航
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联