运行 使用 APScheduler 和 flask 的计划任务(使用 mod_wsgi)
Run scheduled task with APScheduler with flask (using mod_wsgi)
我正在尝试每天在特定时间在 Flask 中在后台发送电子邮件。该应用程序在我添加工作时挂起,我认为我遇到了线程问题。配置看起来像这样
jobstores = {
'default': SQLAlchemyJobStore(url='path_to_my_db')
}
executors = {
'default': ThreadPoolExecutor(5),
'processpool': ProcessPoolExecutor(3)
}
job_defaults = {
'coalesce': False,
'max_instances': 3
}
scheduler = BackgroundScheduler(jobstores=jobstores, executors=executors, job_defaults=job_defaults, timezone=utc)
scheduler.start()
然后我正在添加我的工作
def send_reports():
msg = Message("Microphone testing 1, 2",
recipients=["me@mycompany.com"])
mail.send(msg)
scheduler.add_job(send_reports, 'cron', hour=8, minute=23)
如果我注释掉 scheduler.add_job
行应用程序运行正常
在虚拟主机中我有行
WSGIDaemonProcess www.mycomapny.com processes=2 threads=5
WSGIScriptAlias / /var/www/html/myapp.wsgi
感谢您的帮助
我终于成功地使用 APSchedular 发送了电子邮件。
我在 Apache 虚拟主机中的设置允许多线程(我正在使用 mod_wsgi)
WSGIDaemonProcess app threads=15 maximum-requests=10000
WSGIScriptAlias / /var/www/html/myapp.wsgi
WSGIProcessGroup app
WSGIApplicationGroup %{GLOBAL}
然后在我的应用中,我首先导入后台BackgroundScheduler
from apscheduler.schedulers.background import BackgroundScheduler
使用时区实例化我的调度程序,但使用所有其他默认配置
scheduler = BackgroundScheduler(timezone='Africa/Nairobi')
然后在第一个请求之前,我启动调度程序并添加 send_reports 作业
@app.before_first_request
def initialize():
scheduler.start()
scheduler.add_job(send_reports, 'cron', hour=10, minute=10, end_date='2055-05-30')
使用 pdfkit 和 flask-email 将报告作为 pdf 附件发送是另一回事,但其要点是安装正确版本的 wkhtmltopdf 并具有正确的 env 路径,并确保将应用程序上下文传递给 flask- mail 在后台线程中发送邮件。
所以这会在 EAT 每天上午 1010 点将报告发送到指定的电子邮件。希望有人觉得这有帮助
我正在尝试每天在特定时间在 Flask 中在后台发送电子邮件。该应用程序在我添加工作时挂起,我认为我遇到了线程问题。配置看起来像这样
jobstores = {
'default': SQLAlchemyJobStore(url='path_to_my_db')
}
executors = {
'default': ThreadPoolExecutor(5),
'processpool': ProcessPoolExecutor(3)
}
job_defaults = {
'coalesce': False,
'max_instances': 3
}
scheduler = BackgroundScheduler(jobstores=jobstores, executors=executors, job_defaults=job_defaults, timezone=utc)
scheduler.start()
然后我正在添加我的工作
def send_reports():
msg = Message("Microphone testing 1, 2",
recipients=["me@mycompany.com"])
mail.send(msg)
scheduler.add_job(send_reports, 'cron', hour=8, minute=23)
如果我注释掉 scheduler.add_job
行应用程序运行正常
在虚拟主机中我有行
WSGIDaemonProcess www.mycomapny.com processes=2 threads=5
WSGIScriptAlias / /var/www/html/myapp.wsgi
感谢您的帮助
我终于成功地使用 APSchedular 发送了电子邮件。
我在 Apache 虚拟主机中的设置允许多线程(我正在使用 mod_wsgi)
WSGIDaemonProcess app threads=15 maximum-requests=10000
WSGIScriptAlias / /var/www/html/myapp.wsgi
WSGIProcessGroup app
WSGIApplicationGroup %{GLOBAL}
然后在我的应用中,我首先导入后台BackgroundScheduler
from apscheduler.schedulers.background import BackgroundScheduler
使用时区实例化我的调度程序,但使用所有其他默认配置
scheduler = BackgroundScheduler(timezone='Africa/Nairobi')
然后在第一个请求之前,我启动调度程序并添加 send_reports 作业
@app.before_first_request
def initialize():
scheduler.start()
scheduler.add_job(send_reports, 'cron', hour=10, minute=10, end_date='2055-05-30')
使用 pdfkit 和 flask-email 将报告作为 pdf 附件发送是另一回事,但其要点是安装正确版本的 wkhtmltopdf 并具有正确的 env 路径,并确保将应用程序上下文传递给 flask- mail 在后台线程中发送邮件。
所以这会在 EAT 每天上午 1010 点将报告发送到指定的电子邮件。希望有人觉得这有帮助