介绍
这篇文章主要介绍Django防止定时任务并发的案例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
<强>前言强>
Django提供了命令类,允许我们编写命令行脚本,并且可以通过python管理。py拉起。
<>强了解命令强>
具体django命令如何使用,大家参考官方文档即可:https://docs.djangoproject.com/en/2.2/howto/custom-management-commands/
<强>一个坑
强>
使用时遇到一个坑:运在命令行中的异常并不会打印到屏幕上,它要求我们必须抛出CommandError类型的异常才能被打印到屏幕中,具体参考:https://docs.djangoproject.com/en/2.2/howto/custom-management-commands/command-exceptions
<强>文件锁防并发强>
我们通常利用Crontab拉起定时任务,那么就会面临一个常见问题,如何避免前一次没结束而后一次再次启动的问题。
通常都是用文件锁来搞定这个事情,我做了一个简单的装饰器来包装命令的处理方法,定义一套元类或者类装饰器都可以达到同样的目的,这里就不炫技了。
#, - *安康;编码:utf-8 - * - 它import fcntl import 操作系统 得到apps.settings import  CRON_LOCK_DIR #,尝试加锁 def try_lock(名称): def 才能;装饰(函数): ,,,def 包装(* args,, * * kwargs): ,,,,,os.makedirs (CRON_LOCK_DIR, exist_ok=True) ,,,,,with 开放(& # 39;{}/{}& # 39;.format (CRON_LOCK_DIR,,名字),& # 39;w # 39;), as fd: ,,,,,,,试一试: ,,,,,,,,,fcntl.lockf (fd, fcntl.LOCK_EX |, fcntl.LOCK_NB), #,加锁 ,,,,,,,,,func (* args,, * * kwargs) ,,,,,,,,,fcntl.lockf (fd, fcntl.LOCK_UN), #,解锁 ,,,,,,,只是,,#,加锁异常跳过 ,,,,,,,,, ,,,return 包装 return 才能;装饰
其中CRON_LOCK_DIR是文件锁的父目录、下面放了若干锁文件。
对命令的处理方法指定锁文件名即可:
class 命令(BaseCommand): @try_lock才能(& # 39;check_order& # 39;), #,指定锁文件的名字 def 才能;处理(自我,,* args,, * *选项): ,,,通过
以上是“Django防止定时任务并发的案例”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!