我在Django Admin(Django 1.8)中保存一个对象并将它们传递给Celery Task。不幸的是,我收到了一个错误[有时!]:"匹配查询不存在"。我知道这是交易的问题,但解决这个问题的最佳方法是什么?
int contTotal = 0;
double result = 0;
for(DoubleWritable val : valores) {
contTotal += val.get();
}
result = (contTotal/714861) *100;
问题是Django Admin中的整个视图位于transaction.atomic()块中。而且有时芹菜在交易结束时运行得更快。我想知道解决这个问题的最佳方法是什么。在调用celery_task时添加eta是一个令人毛骨悚然的想法我认为(或者可能不是?) - class MyModelAdmin(admin.ModelAdmin)
def save_model(self, request, obj, form, change):
super(MyAdmin, self).save_model(request, obj, form, change)
if not change:
celery_task.delay(obj.pk)
@app.task()
def celery_task(obj_pk):
MyModel.objects.get(pk=obj_pk)
答案 0 :(得分:1)
我认为eta
是个好主意。但是竞争条件的可能性仍然存在,因此,eta
可以@app.task(default_retry_delay=60, max_retries=3) # retry in 1 minute with maximum 3 retries
def celery_task(obj_pk):
try:
MyModel.objects.get(pk=obj_pk)
except MyModel.DoesNotExist, exc:
celery_task.retry(exc=exc)
进行故障转移:
rails generate controller welcome index