【问题标题】:Django Architecture: Where should I schedule a Celery Beat Periodic Task for ALL users?Django 架构:我应该在哪里为所有用户安排 Celery Beat 定期任务?
【发布时间】:2019-07-28 22:03:07
【问题描述】:

我有一个django-celery-beat 定期任务,需要在每周的每个星期一为每个用户运行。我不确定第一次在哪里创建这个任务的正确位置来安排它。

我知道可以使用PeriodicTaskInterval 在特定代码中的任何位置创建每个用户的 celery 任务,但由于这是为每个用户运行的,我不太确定它应该去哪里或如何实例化它。

【问题讨论】:

    标签: python django celery


    【解决方案1】:

    periodic_tasks.py

    # Run every time at 7:30 am on monday.
    @periodic_task(run_every=crontab(hour=7, minute=30, day_of_week=1))
    def test_hulk_task():
        """First hulk periodic task for testing."""
        logger.log('info', {'event': 'test_hulk_periodic_task'})
    

    在设置中

    CELERY_IMPORTS = ("path.to.periodic_tasks",)
    

    注意:如果您没有在项目中设置 celery 设置。 关注这个link

    【讨论】:

    • 谢谢,看来django-celery-beat 有一个用于创建周期性任务的管理工具。
    【解决方案2】:

    需要明确的是,您不需要为 100 个用户创建 100 个任务。您创建 1 个任务,为每个用户执行 X。您为“每个用户”执行此操作的事实不相关/对任务定义没有影响。

    只要做:

    @task
    def task_foo():
        """Do `bar` to every user."""
        users = get_user_model().objects.all()
        for user in users:
            do_bar(user)
    

    如果你真的想为每个用户创建 1 个任务,而不是调用 do_bar() 你可以调用一个单独的任务,例如task_bar.d(user).

    【讨论】:

    • 是的,这就是我的问题所在。当单个用户有某种一次性任务时,我可以在他们注册时安排它。我不确定我应该在我的代码中的哪个位置安排一个像我所描述的那样通用的任务。我是否在服务器启动时执行此操作并在计划后删除代码等?我是否只检查它是否存在并在服务器启动时忽略它?
    • Celery 有一个叫做“周期性任务”的东西,所以你可以创建按特定时间表自动触发的任务(例如每分钟、每小时、每天、每周等)。您可以像 @sp1rs 那样通过装饰器定义时间表,也可以在 Celery python 文件中定义它。 docs.celeryproject.org/en/latest/userguide/periodic-tasks.html
    猜你喜欢
    • 2020-04-05
    • 2021-11-14
    • 1970-01-01
    • 2022-01-22
    • 2018-09-17
    • 2020-07-14
    • 2021-02-25
    • 1970-01-01
    • 2020-03-08
    相关资源
    最近更新 更多