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