没有标志在课堂上有效。 Django在两个独立的进程上运行两次。两个独立进程上的类级变量彼此不可见。在这个代码中使用一个来自数据库表的标志(SchedulerUtils是我用go()方法编写的一个类,它启动了一个背景apscheduler调度器,该模型在表scheduler_schedulerinfo中使用了一行,所以你必须在这之前插入这一行: “INSERT INTO scheduler_schedulerinfo(启动)的值(0);”):
################################## APPS.PY
import os
from django.apps import AppConfig
from apscheduler.schedulers.background import BlockingScheduler, BackgroundScheduler
from scheduler.utils import SchedulerUtils
class SchedulerConfig(AppConfig):
name = 'scheduler'
def ready(self):
startScheduler = True
pid = os.getpid()
#check i'm on heroku
if (os.environ.get("DYNO")):
# i'm on heroku, here runs twice
print("[%s] DYNO ENV exists, i'm on heroku" % pid)
from scheduler.models import SchedulerInfo
schedInfo = SchedulerInfo.objects.all().first()
if (schedInfo.started == 0):
print("[%s] Scheduler not started, starting.... " % pid)
startScheduler = True
# set flag to 1
SchedulerInfo.objects.all().update(started = 1)
else:
print("[%s] Scheduler already running, not starting." % pid)
startScheduler = False # already running
# reset to 0 for next time
SchedulerInfo.objects.all().update(started = 0)
# PRINT FLAG VALUE
from scheduler.models import SchedulerInfo
schedInfo = SchedulerInfo.objects.all().first()
print("[%s] Value of flag schedulerinfo.started: %d" % (pid, schedInfo.started))
if (startScheduler):
su = SchedulerUtils()
su.go()
##################################### MODELS.PY
from django.db import models
class SchedulerInfo(models.Model):
started = models.IntegerField(default=0)
有同样的问题。你解决了吗? –
@PavelBernshtam,如果我没有记错,它是运行多线程的gunicorn。当我更换服务员托管时,问题就消失了。我甚至没有包含'run_already = False','并且不包含self.run_already'代码。 – dmcmulle