Python 作业不是由APScheduler';背景调度器

Python 作业不是由APScheduler';背景调度器,python,django,docker,apscheduler,Python,Django,Docker,Apscheduler,我有一个Django应用程序,我正在Docker上运行。我正在尝试在运行docker容器时启动APScheduler调度程序 from apscheduler.schedulers.blocking import BlockingScheduler from apscheduler.schedulers.background import BackgroundScheduler #scheduler = BlockingScheduler() scheduler = BackgroundSch

我有一个Django应用程序,我正在Docker上运行。我正在尝试在运行docker容器时启动APScheduler调度程序

from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.schedulers.background import BackgroundScheduler

#scheduler = BlockingScheduler()
scheduler = BackgroundScheduler()

def test1():
    ... (code to send email)

scheduler.add_job(test1, 'interval', seconds = 20)
scheduler.start()
我创建了一个调度程序,并简单地将其添加到一个名为test1的作业中,该作业将向我的地址发送电子邮件

这是在运行容器时启动的Python脚本

from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.schedulers.background import BackgroundScheduler

#scheduler = BlockingScheduler()
scheduler = BackgroundScheduler()

def test1():
    ... (code to send email)

scheduler.add_job(test1, 'interval', seconds = 20)
scheduler.start()
这是我从两种调度器中获得的结果:


  • BlockingScheduler:调度器工作,我每20秒收到一封电子邮件。但是,我无法访问该应用程序。我认为这是正常的,因为BlockingScheduler的本质

  • BackgroundScheduler:访问应用程序没有问题。但是,我没有收到电子邮件
由于电子邮件是在两种情况中的一种情况下发送的,我想问题与Django和Docker无关,而纯粹与APScheduler有关。我做了研究,但我找不到为什么BackgroundScheduler不能像我读的教程中那样工作,开发人员用与我相同的方式设置了调度器

任何帮助都将不胜感激,谢谢

更新1

我尝试了以下两种方法,都使BackgroundScheduler表现得像BlockingScheduler(这不是我想要的)

1) 初始化计划程序实例时,将守护程序选项设置为False:

scheduler = BackgroundScheduler(daemon = False)
2) “试图使主线程保持活动状态”,如下所述:

我在scheduler.starts()之后添加了此选项:

更新2

当我尝试在单个Python文件(在任何应用程序上下文之外)中设置BackgroundScheduler时,它工作得非常好:

from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.schedulers.blocking import BlockingScheduler


def test1():
    print('issou')

scheduler = BackgroundScheduler()
scheduler.start()
scheduler.add_job(test1, 'interval', seconds=5)

print('yatangaki')
“yatangaki”首先打印,然后每5秒打印一次“issou”,所以一切看起来都很好

更新3

现在,我尝试在Django应用程序上启动调度程序,我在本地使用
python manage.py runserver
,而不使用Docker

它工作完美:电子邮件被发送,我可以访问应用程序的主视图


注意:BackgroundScheduler由一个名为
start\u test1
的函数启动。在这个应用程序中,我在顶级URL.py文件中运行
start\u test1
。在另一个应用程序上,我使用Docker运行的应用程序,这是我想在最后使用的应用程序-
start\u test1
是在Python脚本中启动的,该脚本本身在一个.sh文件中触发,我通过CMD Docker命令运行该文件。

看来启动调度程序和添加作业都是关于

在我最初所做的(将代码放入.sh文件中)中,BackgroundScheduler启动,但运行后Python脚本立即结束,因为它没有阻塞行为,并且sh.file不是应用程序的一部分(它由Dockerfile使用,而不是由应用程序使用)

我最终在这里找到了解决方案: 我的应用程序中没有apps.py文件,所以我创建了一个,并按照此线程中的说明进行操作


它现在可以正常工作。

“但是我无法访问应用程序”你这么说是什么意思?我的意思是,当我转到localhost:8000时,我得到了“无法访问此站点,localhost拒绝连接”,这与我使用BackgroundScheduler时的情况不同。我将在我的帖子中添加一个屏幕截图,以使其更清晰。您在终端控制台中看到其他内容了吗,您在那里执行了manage.py runserver?哦,我看到了您的屏幕截图,在第一个屏幕截图中,您有一个错误的url,应该是:而不是我猜
BackgroundScheduler
使用线程池作为执行器,所以可能是线程问题。我也有这个问题,我将apscheduler start函数放在
url.py
中,但过了一段时间,作业仍然停止工作。