gpt4 book ai didi

python - celery 任务中缺少 Django 相关对象(竞争条件?)

转载 作者:行者123 更新时间:2023-11-30 23:18:10 24 4
gpt4 key购买 nike

奇怪的行为,我不知道如何解释。我有一个模型,Track,以及一些相关的。我调用 celery 任务来执行一些点计算,它们似乎在方法本身中完全可以访问,但在 celery 任务中不可用。

@shared_task
def my_task(track):
print 'in the task', track.id, track.points.all().count()

def some_method():
t = Track()
t.save()
t = fill_with_points(t) # creating points, attaching them to a Track
t.save()
print 'before the task', track.id, track.points.all().count()
my_task.delay(t)

打印以下内容:

before the task, 21346, 2971
in the task, 21346, 0

奇怪的是,当我在 my_task 的第一行或调用 my_task 之前放置 time.sleep(10) 时,效果很好,就像有一些竞争条件。但第一行打印清楚地表明,当它进行选择查询时,points 在数据库中可用 (track.points.all().count())。

最佳答案

我假设这是由于事务隔离造成的。

Django 事务默认与请求绑定(bind);当事务处于事件状态时,在事务提交之前,其他进程不会看到更改。如果您正处于保存方法的中间,并且在请求完成之前发生了很多其他操作,那么 Celery 可能会在提交事务之前开始处理任务。您可以通过手动提交或延迟任务来解决此问题。

关于python - celery 任务中缺少 Django 相关对象(竞争条件?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26862942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com