Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在上次刷新Django/Celery后9天为用户安排任务_Python_Django_Celery_Django Celery_Django Cron - Fatal编程技术网

Python 在上次刷新Django/Celery后9天为用户安排任务

Python 在上次刷新Django/Celery后9天为用户安排任务,python,django,celery,django-celery,django-cron,Python,Django,Celery,Django Celery,Django Cron,这是在为用户刷新访问令牌的上下文中进行的。假设我们有函数refresh\u user\u token,它将CustomUser对象作为user接收 def refresh_user_token(user): ... ... return result 对于特定的CustomUser执行此功能,我希望在9天内安排一次重复 def refresh_user_token(user): ... ... next_refresh = datetime.no

这是在为用户刷新访问令牌的上下文中进行的。假设我们有函数
refresh\u user\u 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
我看到的芹菜的大多数用例都是关于执行批处理操作的,但是对于这种用法,我需要能够使用芹菜似乎不可行的参数执行函数


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

因此,在
CustomUser
对象上,我们有一个名为
last\u token\u refresh
DateTimeField

@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
这可能行得通,但当MessageBroker只能用来安排所需的任务时,我觉得这很麻烦。

您可以使用crontab来安排芹菜任务。只需创建您的常规芹菜任务,并使用节拍来确定何时跑步

这是我在一个项目中的芹菜节拍设置示例:

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天前更新的用户。您会注意到,在我的问题中,我提到了确切的解决方案,我正在寻找替代方案,因为我觉得这不合适或不可扩展。嗯,如果您找到了一种更好的方法来处理周期性任务,而不必重复计划,请让所有人都知道。与其遍历我的整个用户群以查看谁没有每隔几秒钟刷新一次,不如使用message broker为用户计划作业。这样,我只在需要运行作业时运行作业,而不使用资源进行检查。