使用带有烧瓶的APScheduler运行计划的任务(使用mod_wsgi)

时间:2018-08-24 10:40:13

标签: multithreading flask mod-wsgi background-process

我正在尝试每天在特定时间在烧瓶中在后台发送电子邮件。该应用程序几乎在我添加工作时挂起,并且我认为线程问题。配置看起来像这样

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

将感谢您的协助

1 个答案:

答案 0 :(得分:1)

我终于设法通过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到在后台线程中发送邮件。

因此,它将每天在美国东部时间上午1010时将报告发送到指定的电子邮件。希望有人觉得这有用