Py学习  »  Django

Django使用多线程进行测试,对数据库的更改不会持久

Alister • 4 年前 • 321 次点击  

我试图复制我们正在生产服务器上遇到的一个问题,如果两个请求被保存或更新和现有的对象,如果在非常接近的间隔进行,将导致两个实例被创建而不是后来的一个(即使以毫秒减慢)更新现有的一个实例。为了测试我们为防止这种情况而提出的任何解决方案,我试图通过多处理来复制这种情况。我遇到的唯一问题是,在两个进程运行并完成之后,当我在主函数中查询数据库时,尽管子进程中通过了相同的测试,但子进程中所做的更改并没有持久化。代码摘录:

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
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/53158
 
321 次点击