【问题标题】:Schedule Task for User 9 Days After Last Refresh Django/Celery上次刷新 Django/Celery 后 9 天为用户安排任务
【发布时间】:2019-08-20 16:20:41
【问题描述】:

这是在为用户刷新访问令牌的上下文中。假设我们有函数refresh_user_token,它将CustomUser 对象作为user

def refresh_user_token(user):
    ...
    ...
    return result

我希望为特定的CustomUser 每次执行此函数以安排在 9 天内重复。

def refresh_user_token(user):
    ...
    ...
    next_refresh = datetime.now() + timedelta(days=9)
    schedule_refresh(user, scheduled_time=next_refresh)
    return result

我看到的 Celery 的大多数用例都与执行批处理操作有关,但对于这种用途,我需要能够使用 Celery 似乎不可行的参数来执行函数。


确实有人建议设置一个 cron 作业来检查任何需要刷新 x 秒的令牌。

所以在CustomUser 对象上,我们有一个名为last_token_refreshDateTimeField

@Celery.task
def refresh_auth_tokens():
    users = CustomUser.objects.all()
    for user in users:
        last_refresh_delta = datetime.now(timezone.utc) - user.last_token_refresh
        if last_refresh_delta.days >= 9:
            refresh_user_token(user)
            return True
        else:
            return False

这可以工作,但是当消息代理可以用于仅安排所需任务时,我觉得它非常费力。

【问题讨论】:

    标签: python django celery django-celery django-cron


    【解决方案1】:

    您可以使用Celery Beat 使用 crontabs 来安排 celery 任务。只需创建您的常规 Celery 任务并使用 Beat 来说明何时运行。

    这是我在一个项目中使用的 Celery Beat 设置示例:

    CELERY_BEAT_SCHEDULE = {
        'populate_controller': {
            'task': 'common.tasks.populate_controller',
            # Will be executed Mondays, at 08:30 
            'schedule': crontab(day_of_week=2, 
                                hour=8, 
                                minute=30),
        'options': {'queue': 'populate_controller'}
        },
     }
    

    【讨论】:

    • 这并不能解决问题。问题是我希望能够为特定用户和不同时间安排任务。每次执行后 9 天专门针对该用户。
    • 您可以通过使用查询来调整您的任务以找到您想要处理的用户来实现这一点。只需设置 cron 任务并考虑找到需要更新的用户的正确方法。将 cron 设置为每天运行并更新您在特定日期需要更新的所有用户,查询 9 天前更新的用户。
    • 您会在我的问题中注意到我提到了确切的解决方案,我正在寻找替代方案,因为我觉得这不合适或可扩展。
    • 好吧,如果您找到一种更好的方法来处理周期性任务而无需重复日程安排,请告诉大家。
    • 与其遍历我的整个用户群以查看谁没有每隔几秒刷新一次,更优雅的解决方案是使用消息代理为用户安排作业。这样,我只在需要运行作业时才运行作业,而不是仅使用资源进行检查。
    猜你喜欢
    • 2012-01-16
    • 2019-07-10
    • 1970-01-01
    • 2016-09-30
    • 2013-02-10
    • 2023-03-24
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多