Django多次初始化AppConfig

问题描述

我想在我的 AppConfig 中使用 ready() 钩子来启动 django-rq 调度程序作业。但是,每次我启动服务器时,它都会这样做多次。我想这是由于线程,但是我似乎找不到合适的解决方法。这是我的 AppConfig:

class AnalyticsConfig(AppConfig):
    name = 'analytics'

    def ready(self):
        print("Init scheduler")
        
        from analytics.services import save_hits
        scheduler = django_rq.get_scheduler('analytics')
        scheduler.schedule(datetime.utcnow(),save_hits,interval=5)
        

现在当我执行 runserver 时,Init scheduler 会显示 3 次。我已经做了一些挖掘,根据 this 问题,我用 --noreload 启动了服务器,但没有帮助(我仍然得到 Init scheduler x3)。我也试过放

import os

if os.environ.get('RUN_MAIN',None) != 'true':
    default_app_config = 'analytics.apps.AnalyticsConfig'

在我的 __init__.py 中,但是 RUN_MAIN 每次似乎都是 None

之后我创建了一个 FileLock 类,在第一次初始化后跳过配置,如下所示:

class FileLock:
    def __get__(self,instance,owner):
        return os.access(f"{instance.__class__.__name__}.lock",os.F_OK)

    def __set__(self,value):
        if not isinstance(value,bool):
            raise AttributeError

        if value:
            f = open(f"{instance.__class__.__name__}.lock",'w+')
            f.close()
        else:
            os.remove(f"{instance.__class__.__name__}.lock")

    def __delete__(self,obj):
        raise AttributeError

class AnalyticsConfig(AppConfig):
    name = 'analytics'
    locked = FileLock()

    def ready(self):
        from analytics.services import save_hits

        if not self.locked:
            print("Init scheduler")
            scheduler = django_rq.get_scheduler('analytics')
            scheduler.schedule(datetime.utcnow(),interval=5)

            self.locked = True

这确实有效,但是在应用程序退出后锁不会被破坏。我尝试删除 settings.py 中的 .lock 文件,但它也运行了多次,因此毫无意义。

我的问题是:如何防止 django 多次调用 ready(),或者如何在 django 退出或启动后立即拆除 .lock 文件?

我使用的是 python 3.8 和 django 3.1.5

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)