Django防止定时任务并发的案例

  介绍

这篇文章主要介绍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防止定时任务并发的案例”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

Django防止定时任务并发的案例