烧瓶邮件,发送批量电子邮件时关闭连接

时间:2016-03-01 16:10:51

标签: python flask cron flask-mail

我有一个基于flask的web应用程序和flask-mail(https://pythonhosted.org/flask-mail/)来发送电子邮件。 我每5分钟运行一次cronjob,检查数据库中的更新,如果发现更新,它会向受这些更新影响的所有用户发送一堆电子邮件。可能发生的是,发送的电子邮件数量太大,以至于作业未在5分钟内完成,这意味着cron正在并行启动另一个作业。我的理解是,如果它在5分钟后仍在运行,那么cron不会杀死旧工作。然而,似乎发生的事情是发送电子邮件的连接在旧工作中被关闭了?这意味着在这种情况下并非所有用户都收到电子邮件。 以下是我发送电子邮件的方式

users = models.User.query.filter_by(query_email_notification=1).all()
if users:
    # Bulk emails... keep connection open
    with app.app_context():
        with mail.connect() as conn:
            for user in users:
                subject = "subject"
                message = 'Hi'
                msg = Message(recipients=[user.email],
                      body=message,subject=subject, sender='me@gmail.com')
                conn.send(msg) 

基本上遵循flask-mail网站上的主要示例。但是,每当新的cronjob开始连接关闭并且不再发送电子邮件时。有谁知道为什么会发生这种情况以及如何防止这种情况发生? 一种解决方案是确保cron只在旧工作完成后才开始新工作。但这对cron来说似乎很混乱。是否有其他软件可以做到这一点? 谢谢卡尔

1 个答案:

答案 0 :(得分:1)

可以使用flock来序列化长时间运行的cron作业。例如,请参阅https://serverfault.com/a/461637/82655