作业不是由 APScheduler 的 BackgroundScheduler 执行的
Job is not performed by APScheduler's BackgroundScheduler
我有一个 Django 应用程序,我 运行正在 Docker 上运行。当我 运行 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) "Trying to keep the main thread alive",如下所述:
how-do-i-schedule-an-interval-job-with-apscheduler
我在 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 脚本在 运行, 因为它没有阻塞行为和 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 个中的 1 个停止(工作退出)后再次启动
也是Django的一部分,但是很明显start不是exiting...
我有一个 Django 应用程序,我 运行正在 Docker 上运行。当我 运行 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) "Trying to keep the main thread alive",如下所述:
how-do-i-schedule-an-interval-job-with-apscheduler
我在 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 脚本在 运行, 因为它没有阻塞行为和 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 个中的 1 个停止(工作退出)后再次启动
也是Django的一部分,但是很明显start不是exiting...