我试图复制我们在生产服务器上遇到的问题,在该问题上,如果发出两个保存或更新请求以及现有对象,如果间隔非常近,则会导致创建两个实例,而不是后来的一个(即使慢了几毫秒)更新了现有的一个。为了测试我们提出的防止这种情况的解决方案,我试图通过多处理来复制这种情况。我遇到的唯一问题是两个进程运行并完成后,当我在main函数中查询数据库时,尽管子进程中通过了相同的测试,但据称在子进程中所做的更改并未持久。代码提取:
def save_a_generic_model(self, id):
data = {'value': '1'}
request = RequestFactory().post('/api/responses/',
data=json.dumps(data),
content_type='application/json')
request.user = self.user
print(f'Process {id} started at {time()}')
response = self.view(request)
self.assertEqual(response.status_code, 202)
self.assertEqual(len(models.GenericModel.objects.all()), 1)
print(f'Process {id} finished at {time()}')
def test_multiple_post_to_api(self):
jobs = []
db.connections.close_all()
for i in range(0, 2):
jobs.append(Process(target=self.save_a_generic_model, args=(i,)))
for i in range(0, 2):
jobs[i].start()
for i in range(0, 2):
jobs[i].join()
self.assertEqual(len(models.GenericModel.objects.all()), 1) # Fails here