繁体   English   中英

作业不是由 APScheduler 的 BackgroundScheduler 执行的

[英]Job is not performed by APScheduler's BackgroundScheduler

我有一个在 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 的本质,我认为这是正常的。

截图1

截图2

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

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

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

更新 1

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

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

scheduler = BackgroundScheduler(daemon = False)

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

我如何安排时间间隔作业与 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

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

它运行良好:电子邮件已发送,我可以访问应用程序的主视图。

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

似乎所有关于从何处启动调度程序和添加作业。

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

我最终在这里找到了解决方案: execute-code-when-django-starts-once-only我的应用程序中没有apps.py文件所以我创建了一个并遵循该线程中的指令。

它现在工作正常。

我有一个类似的问题,但只有通过不阻止工作人员才能解决:

# working:
def worker():

    phone_elm = ....
    thread = threading.Thread(target=work, args=(phone_elm,))
    thread.start()

# not working:
def worker():
    phone_elm = ....
    work(phone_elm)

scheduler2 = BackgroundScheduler(timezone="Asia/Kolkata")
# schedule scanning running of folder's running file
scheduler2.add_job(worker, 'interval', seconds=15,  max_instances=5000)

scheduler1.start()

我的意思是不工作,是在 10 ~ 时间后触发它无缘无故停止,在 10 个停止后再次启动(工作退出)

它也是 Django 的一部分,但很明显 start 没有退出......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM