繁体   English   中英

如何确保 Django 模型在 Celery 任务执行之前保存?

[英]How to ensure Django model saves before Celery task execution?

我有一个 Django 1.11 + MySQL + Celery 4.1 项目,其中一个视图创建一个新的用户记录,然后启动一个 Celery 任务来执行与其相关的其他长时间运行的操作。

这种情况下的典型问题是确保在 Celery 任务执行之前将用户创建提交到数据库。 否则,会出现竞争条件,如果任务在事务提交之前执行,则该任务可能会尝试访问不会退出的记录。

我学会了解决这个问题的方法是始终将记录创建包装在手动事务或原子块中,然后在此之后触发 Celery 任务。 例如

def create_user():
    with transaction.atomic():
        user = User.objects.create(username='blah')
    mytask.apply_async(args=[user.id])

@task
def mytask(user_id):
    user = User.objects.get(id=user_id)
    do_stuff(user)

但是,我仍然偶尔会看到错误DoesNotExist: User matching query does not exist我的Celery 工作日志DoesNotExist: User matching query does not exist ,这意味着我的任务有时会在用户记录提交之前执行。

这不是正确的策略还是我没有正确实施它?

我相信post_save信号更适合您要执行的操作: https : post_save 此信号将created参数作为布尔值发送,从而可以轻松地仅对对象创建进行操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM