【发布时间】:2019-07-28 22:03:07
【问题描述】:
我有一个django-celery-beat 定期任务,需要在每周的每个星期一为每个用户运行。我不确定第一次在哪里创建这个任务的正确位置来安排它。
我知道可以使用PeriodicTask 和Interval 在特定代码中的任何位置创建每个用户的 celery 任务,但由于这是为每个用户运行的,我不太确定它应该去哪里或如何实例化它。
【问题讨论】:
我有一个django-celery-beat 定期任务,需要在每周的每个星期一为每个用户运行。我不确定第一次在哪里创建这个任务的正确位置来安排它。
我知道可以使用PeriodicTask 和Interval 在特定代码中的任何位置创建每个用户的 celery 任务,但由于这是为每个用户运行的,我不太确定它应该去哪里或如何实例化它。
【问题讨论】:
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 有一个用于创建周期性任务的管理工具。
需要明确的是,您不需要为 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).
【讨论】: