Django тестирование с многопоточностью, изменения в базе данных не сохраняются - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь повторить проблему, с которой мы сталкиваемся на нашем производственном сервере, когда кажется, что два запроса на сохранение или обновление существующего объекта, если они сделаны с очень близким интервалом, приведут к созданию двух экземпляров вместопозже один (даже если медленнее на миллисекунды) обновляет существующий. Чтобы протестировать любое решение, которое мы придумали, чтобы предотвратить это, я пытаюсь воспроизвести это через многопроцессорность. Единственная проблема, с которой я сталкиваюсь, заключается в том, что после запуска и завершения двух процессов, когда я запрашиваю базу данных в основной функции, изменения, предположительно сделанные в подпроцессах, не сохраняются, несмотря на те же тесты, проходящие в подпроцессах. Извлечение кода:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...