周期任务的动态创建

2024-04-24 19:05:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我发现this soultion可以使用django-celery动态添加定期任务计划。

我的用例是mailings,它是为web站点的用户单独添加的,每个邮件都有一个与之相关联的PeriodicTask,因此数据库中可能有大量的{}记录。在

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


Tags: django用户web数据库站点记录邮件动态
3条回答

你能不能没有一个周期性的任务,每天、每周或其他时间运行,在这个任务中,第一部分计算所有需要邮件的用户?一旦你了解了所有这些,你就可以在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

我很感激这不能回答问题,因为它形成了,但它应该允许你避免发现这个限制是否存在或添加计划任务编程!在

根据它的创造者,问索莱姆in this thread

There is no known limit to the number of periodic tasks, and the celerybeat scheduler should perform well even with a large number of schedule entries.

That Google group thread和{a3}是最能说明你所关心的问题的。在

说到这里,我想给你一个建议:即使celerybeat scheduler能够处理大量的周期性任务,这也会带来成本:更多的数据库条目、更多的要监视的任务、更多的ram、可能更复杂的调试(因为您正在创建动态任务)、更多的数据库命中(因为您需要检查每个任务)发送它的发送日期时间,然后看看你是否发送了该电子邮件。在

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

希望有帮助。在

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

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

相关问题 更多 >