gpt4 book ai didi

python - Django 竞争条件 : code does not fetch newly created records

转载 作者:行者123 更新时间:2023-11-29 12:49:36 25 4
gpt4 key购买 nike

我正在运行 Django(1.11.20,ATOMIC_REQUESTS: True)和 Postgres,并且有一个 Django View 基本上可以:

job = Job(name='hello')
job.save()
files = JobFile.objects.create(job_id=job.id, file='myfile.txt')

大多数时候,这工作正常。但是每隔一段时间,另一个进程(由 cron 执行)检查 JobFile 表并发现它不包含给定现有 Job 的记录,在执行以下操作时:

jobs = Job.objects.filter(timestamp=my_timestamp)
job_files = {}
for jf in JobFile.objects.filter(job__in=jobs):
try:
job_files[jf.job_id].add(jf.file)
except KeyError:
job_files[jf.job_id] = set([jf.file])

for job in jobs:
files = job_files[job.id] if job.id in job_files else set()
print('Job {} found with files {}'.format(job.id, files))

# output when this problem occurs is typically:
# Job found 123 with files set()

它报告它在日志和错误中找到了一个没有 JobFileJob,当我稍后检查时,数据库包含一个 JobFile就好了。

我一直在摸不着头脑,为什么找不到 JobFile 记录,现在我调查发现,在最近出现的这个问题中,cron 进程在记录创建前大约 0.1 秒启动,并且紧接着完成,这让我怀疑存在某种时间问题。但我的(有限的)理解是,当这一切都在一个 View 中时,ATOMIC_REQUESTS 将确保两个对象都存在。我的另一个怀疑是 create 方法,但在根据其 source 调用保存后,它似乎返回得很好。 .我错过了什么?

最佳答案

看起来你有竞争条件。 Django 和 Postgres 使用 READ COMMITTED隔离级别,这意味着您的 cron 作业中的查询将在提交事务后看到新对象。

我已经在你的代码中添加了注释来解释这个问题

# This doesn't cause a query because Django querysets are lazy
jobs = Job.objects.filter(timestamp=my_timestamp)
job_files = {}
# This fetches the jobfiles for the jobs existing at this point
for jf in JobFile.objects.filter(job__in=jobs):
try:
job_files[jf.job_id].add(jf.file)
except KeyError:
job_files[jf.job_id] = set([jf.file])

# During the loop above, extra jobs and jobfiles are saved to the database

# This line causes the jobs queryset to be evaluated. It includes the new jobs
for job in jobs:
files = job_files[job.id] if job.id in job_files else set()
print('Job {} found with files {}'.format(job.id, files))

您可以通过使用 list() 强制在脚本开头评估作业查询集来避免错误。

jobs = list(Job.objects.filter(timestamp=my_timestamp))

关于python - Django 竞争条件 : code does not fetch newly created records,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57557121/

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