Python 周期任务的动态创建

Python 周期任务的动态创建,python,django,celery,Python,Django,Celery,我发现可以使用django芹菜动态添加定期任务计划 我的用例是邮件,它是为网站用户单独添加的,每个邮件都有一个与其关联的PeriodicTask,因此数据库中可能有大量PeriodicTask记录 我很感兴趣-在这种情况下,这是有效的(合法的、适当的、正确的)解决方案,还是最好只有一个或几个PeriodicTask,它会检查邮件最后一次发送的情况,并在必要时发送邮件?很大程度上取决于您的工作性质。如果您可以将您的用户分组以用于邮件目的,那么安排组的邮件而不是单个用户的邮件似乎是很自然的。如果每个

我发现可以使用
django芹菜
动态添加定期任务计划

我的用例是邮件,它是为网站用户单独添加的,每个邮件都有一个与其关联的
PeriodicTask
,因此数据库中可能有大量
PeriodicTask
记录


我很感兴趣-在这种情况下,这是有效的(合法的、适当的、正确的)解决方案,还是最好只有一个或几个
PeriodicTask
,它会检查邮件最后一次发送的情况,并在必要时发送邮件?

很大程度上取决于您的工作性质。如果您可以将您的用户分组以用于邮件目的,那么安排组的邮件而不是单个用户的邮件似乎是很自然的。如果每个人都有不同的时间表,那么一定要单独安排每个人。这当然是合法的,如果这是你问题的自然解决方案,那么没有令人信服的理由去避免它


您可能想运行一些测试来了解您将生成的负载,但您的方法似乎并不不合理。

根据它的创建者,询问Solem:

周期性任务的数量没有已知的限制,celerybeat调度程序即使有大量的调度条目,也应该表现良好

最能说明你的担忧

话虽如此,我还是想给你一个建议:即使celerybeat scheduler能够处理大量的周期性任务,这也会带来成本:更多的数据库条目,更多的要监控的任务,更多的ram,调试可能更复杂,因为您正在创建动态任务,更多点击数据库,因为您必须检查每个邮件的发送日期时间,然后查看是否发送该电子邮件

另一方面,如果您可以有一个周期性任务,它可以执行一个查询来检索必须发送的邮件实例,并且每个必须发送的电子邮件都可以触发一个子任务,那么在您的代码中,当您必须调试它和监视它时,它看起来会更简单。只要我的两分钱


希望有帮助。

你能不能有一个每天、每周或任何时间运行的周期性任务,并在第一部分计算出当时需要邮寄的所有用户?一旦你了解了所有这些,你就可以在芹菜中为每一个启动一个子任务,这样所有的任务都是异步执行的,并且可以让主任务很快完成,例如

@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

我很感激这并不能回答问题,因为它已经形成,但它应该允许您避免发现是否存在此限制或以编程方式添加计划任务

当我问这个问题时,我主要关心的是——芹菜的有效使用是否会产生数千个周期性的问题——是的,因为我想到了这个选择。反对它的主要论点-因为它就像在芹菜上构建另一个调度程序=)