我正在尝试使用django-background-tasks
从任务更新django模型。这就是我所拥有的:
@background(schedule=0)
def difficult_work():
for i in range(0,100):
time.sleep(1)
with transaction.atomic():
workProgress = WorkProgress.objects.filter(id="fixed_work_id_for_testing").select_for_update().get()
print("updating work progress to " + str(i))
workProgress.progress = i
workProgress.currentJobInfo = "test work"
# if we've finished then make sure to set the status
if i == 100:
workProgress.status = "success"
transfer.save(force_update=True)
此外,我有一个API视图来获取工作任务的进度。
class WorkDetail(APIView):
def get(self, request, workId, format=None):
with transaction.atomic():
work = WorkProgress.objects.filter(id=workId).select_for_update().get()
data = WorkProgressSerializer(transfer).data
return Response(data)
问题是,我在执行任务时没有看到对数据库的任何更新。我已经运行了python manage.py dbshell
,监视数据库表,并且随着任务的进行它们没有更新。我确保运行python manage.py process_tasks
,并输出正确的print
语句,指示进度,但在任务退出之前数据库不会更新。
我找到了遇到类似问题的人here,但他们只是在测试时遇到过这种情况,他们没有get()
更新的模型。但是,我甚至没有在dbshell
中看到数据库更新。
如何在任务运行时确保更新表?
注意:根据this网站,他们使用celery
取得了一些成功。谁能证实这一点?我会试一试并评论可行性。
答案 0 :(得分:1)
您的项目 settings.py
INSTALLED_APPS = [
....
]
...
# Add to Option
BACKGROUND_TASK_RUN_ASYNC=True
答案 1 :(得分:0)
django-background-tasks
似乎在原子事务中执行后台任务(请参阅issue here),这意味着更改仅在任务完成后提交给数据库。
他们最近removed the @atomic
decorators,但没有更改版本号(目前仍然是1.1.13)。