- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个在 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()
这是我使用两种调度器获得的结果:
由于电子邮件是在这两种情况之一中发送的,我猜这个问题既不与 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/
我有一个在 Docker 上运行的 Django 应用程序。我正在尝试在运行 docker 容器时启动 APScheduler 调度程序。 我创建了一个调度程序,我只是向它添加了一个我称为 test1
我试图从 foo() 函数内部停止 while 循环执行。我试过 exit()/sys.exit 但没有成功。如何从函数内部完全停止程序的执行? from apscheduler.schedulers
我是一名优秀的程序员,十分优秀!