问题描述
我想在我的 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 (将#修改为@)