gpt4 book ai didi

python - 作业不是由 APScheduler 的 BackgroundScheduler 执行的

转载 作者:行者123 更新时间:2023-11-28 19:02:06 27 4
gpt4 key购买 nike

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

我创建了一个调度程序,我只是向它添加了一个我称为 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 的本质,我认为这是正常的。

screenshot1

screenshot2

  • BackgroundScheduler:访问应用程序没有问题。但是,我没有收到电子邮件。

由于电子邮件是在这两种情况之一中发送的,我猜这个问题既不与 Django 也不与 Docker 相关,而纯粹与 APScheduler 有关。我做了我的研究,但我找不到为什么 BackgroundScheduler 没有像我阅读的教程中那样工作,开发人员设置调度程序的方式与我相同。

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

更新 1

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

1) 在初始化调度程序实例时将守护进程选项设置为 False:

scheduler = BackgroundScheduler(daemon = False)

2) “试图让主线程保持事件状态”,如下所述:

how-do-i-schedule-an-interval-job-with-apscheduler

apscheduler-inside-a-class-object

我在 scheduler.starts() 之后添加了这个:

while True:
time.sleep(1)
scheduler.shutdown()

更新 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_test1 的函数启动。在此应用中,我在顶级 urls.py 文件中运行 start_test1。在另一个应用程序上——我用 Docker 运行的应用程序,这是我最终想使用的应用程序——start_test1 在 Python 脚本中启动,它本身在 .sh 文件中触发,我通过 CMD Docker 命令运行它。

最佳答案

看起来一切都是关于在哪里启动调度程序和添加作业。

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

我最终在这里找到了解决方案: execute-code-when-django-starts-once-only我的应用程序中没有 apps.py 文件,因此我创建了一个文件并按照此线程中的说明进行操作。

现在一切正常

关于python - 作业不是由 APScheduler 的 BackgroundScheduler 执行的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51636721/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com