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

标签 python django celery race-condition

奇怪的行为,我不知道如何解释。我有一个模型,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/

相关文章:

python - 在 ipython 笔记本中使用 matplotlib 内联时如何禁用 bbox_inches ='tight'

python - 有没有更好的方法来迭代 python 中的嵌套循环

python - 如何从 pandas 数据框中选择部分数据

django - 创建一个新线程发送给管理员

django - NoReverseMatch at/polls/Reverse for 'vote' with argument '(' ', )' not found. 1 pattern(s) tried: [' polls/(?P<question_id>[0-9]+)/vote/$']

python - 在django中对数据进行分组

python - 在python pandas中添加组列的百分比

python - 如何从django信号返回数据?

python - 在 Celery 中记录任务关系

python - 在 Django 中保存数据时 Celery 死锁,为什么?