【问题标题】:Django Celery task and transacrtionDjango Celery 任务和事务
【发布时间】:2018-03-27 21:48:16
【问题描述】:

假设您有一些包含唯一字段的模型,并且您有一个将模型的新实例保存到数据库的异步任务。像这样:

@shared_task
def create_model(model_identifier):
    with transaction.atomic():
        serializer=MyModelSerializer(data=model_data)
        serializer.is_valid()
        serializer.save()
        .
        .
        .
        some more actions

然后您一个接一个地创建了 2 个具有相同标识符的任务。 第一个将首先保存新实例,因此当第二个到达“save()”部分时 - 对象已经存在但尚未提交。 在这种情况下应该怎么办? 如果我做对了,看起来当第二个到达“save()”时(在 is_valid() 通过之后),它等待第一个完成事务(尽管它们基本上是并行运行的)并且只有然后引发了一个 integrityError 异常。

听起来对吗?

【问题讨论】:

    标签: django transactions celery


    【解决方案1】:

    尝试使用@app.task 而不是@shared_task

    解释@app.task 的文档 http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html#application

    使用 apply_async 将任务添加到队列中。

    【讨论】:

    • 谢谢@Mihir Kavatkar,但那应该怎么做呢?它如何回答这个问题?我试过了,好像没什么变化
    • 很久以前我也遇到过类似的问题,在解决了这个问题之后,我能够使它与@app.task 一起工作,并且在我的情况下,预计使用多个工作人员并行执行。对不起,我没有帮助。我需要再调查一下。