Python 多个Django芹菜任务试图保存到同一对象,但失败

Python 多个Django芹菜任务试图保存到同一对象,但失败,python,django,celery,django-celery,Python,Django,Celery,Django Celery,我的tasks.py文件中有三个芹菜@tasks,它们通常由单独的工人同时排队和处理,每个工人的处理时间相似。我认为我遇到的问题是,他们都试图在其他用户配置文件对象完成之前更新同一个用户配置文件对象。三个进程中要完成的最后一个进程似乎是成功写入数据库的进程。如果我在两个任务之间的几秒钟内运行这些,所有任务都会很好地完成 你知道问题出在哪里吗?或者,在配置文件真正起作用之前,一直尝试保存到配置文件的方法是什么 提前感谢您的帮助 我假设您使用的是django,因为您将其标记为django。如果是,可

我的tasks.py文件中有三个芹菜@tasks,它们通常由单独的工人同时排队和处理,每个工人的处理时间相似。我认为我遇到的问题是,他们都试图在其他用户配置文件对象完成之前更新同一个用户配置文件对象。三个进程中要完成的最后一个进程似乎是成功写入数据库的进程。如果我在两个任务之间的几秒钟内运行这些,所有任务都会很好地完成

你知道问题出在哪里吗?或者,在配置文件真正起作用之前,一直尝试保存到配置文件的方法是什么


提前感谢您的帮助

我假设您使用的是django,因为您将其标记为django。如果是,可以使用select_for_update()锁定对象。这将阻止其他工作进程,直到事务完成。如果您的任务运行很长时间,您可能会超时,因此捕获该异常并在必要时重试

from django.db import transaction
from celery.task import task

@task
def mytask(mpk):
    with transaction.commit_on_success():
        my_obj = MyModel.objects.select_for_update().get(pk=mpk)
        ...

请注意,这不适用于sqlite。

Django ORM可以在这里发挥作用。如果使用
model\u object.save()
方法,它会更新所有字段。如果您的任务正在更新同一对象中的不同字段,则可以考虑使用<代码>模型类.Objist.Faster(PK=MythyId).Update(ApHealField=某个值)< />代码,但这里可能会涉及到不同的RDBMS如何实现表/行锁定。


另一个选项是在完成获取用户数据的所有任务时使用和更新用户配置文件。您可能需要实现分布式信号量,因此唯一的chord任务将同时针对同一用户配置文件执行。

看起来更像是数据库锁问题。您是否尝试过编辑配置文件并允许在数据库上进行更多并发操作?例如,在Postgre Debian上编辑您的conf文件:

nano /etc/postgresql/9.4/main/postgresql.conf
max_connections=100
shared_buffers = 3000MB
temp_buffers = 800MB
effective_io_concurrency = 5
max_worker_processes = 15
然后可以在conf文件中设置如下内容:

nano /etc/postgresql/9.4/main/postgresql.conf
max_connections=100
shared_buffers = 3000MB
temp_buffers = 800MB
effective_io_concurrency = 5
max_worker_processes = 15

这应该允许您在描述时进行读/写操作。

即使这些字段是由每个进程更新的单独字段,您也可以这样做吗?有没有一种方法可以将具有相同userprofile行的任务同步地串在一起?有没有一种方法可以尝试一下:除了:配置文件保存的逻辑?如果你想知道更多关于ACID和隔离的Wikipedia文章: