我发现this soultion用于django-celery
动态添加定期任务计划。
我的用例是邮件,它是为网站用户单独添加的,每个邮件都有PeriodicTask
与之关联,因此数据库中可能存在大量PeriodicTask
条记录。
我感兴趣 - 在这种情况下它是否有效(合法,正确,正确)解决方案,或者最好只有一个或几个PeriodicTask
来检查上次发送和发送的邮件他们是否有必要?
答案 0 :(得分:2)
根据它的创造者,Ask Solem in this thread:
对周期性任务的数量没有已知的限制,即使有大量的计划条目,celerybeat调度程序也应该表现良好。
That Google group thread和this one是您对此问题最明确的澄清。
说,我想给你一个建议:即使celerybeat调度程序能够处理大量的周期性任务,也会产生成本:更多的数据库条目,更多的任务需要监控,更多的ram,也许调试的复杂性更高,因为您正在创建动态任务,更多的数据库命中,因为您必须检查每个邮件发送的日期时间,然后查看是否发送该电子邮件。
另一方面,如果你可以有一个周期性任务可以执行一个查询来只检索必须发送的邮件实例,并且每个电子邮件需要发送一个子任务,那么它看起来会更简单在您的代码中,当您必须调试它时以及必须监视它时。只是我的两分钱。
希望它有所帮助。
答案 1 :(得分:1)
你能不能每天,每周或其他任何时间运行一个周期性任务,并且在第一部分中计算所有当时需要邮件的用户?一旦你了解了所有这些,你就可以开始在celery中为每个子任务启动这些子任务,这些子任务都是异步执行的,并且可以让主任务很快完成,例如。
@task
def send_periodic_emails():
users_who_need_mail = get_users_who_need_mail()
for user in users_who_need_mail:
send_user_email.delay(user.id)
@task
def send_user_email(user_id):
# Do email sending here
我很欣赏这不会回答问题,因为它已形成,但它应该允许您避免查明是否存在此限制或以编程方式添加计划任务!
答案 2 :(得分:0)
很大程度上取决于你工作的性质。如果您可以将用户分组到用于邮寄目的的类中,那么安排邮件发送组而不是邮寄个人用户似乎很自然。如果每个人都有不同的时间表,那么无论如何都要单独安排每个人。这当然是合法的,如果它是你问题的自然解决方案,没有令人信服的理由来避免它。
您可能希望运行一些测试来了解您将产生的负载,但您的方法似乎并不合理。