Я пытаюсь проверить, работает ли код, введенный мной для предотвращения условий гонки.
В моем тестовом примере я запустил два потока, и они оба вызвали соответствующий код. Потоки возвращаются нормально, но кажется, что соединения с базой данных postgres остаются открытыми.
Я сократил весь тестовый пример до очень простого примера, в котором обнаруживается проблема:
def test_threading(self):
obj = mommy.make(self.model_class)
def test_concurrency():
self.model_class.objects.get(id=obj.id)
t1 = Thread(target=test_concurrency)
t2 = Thread(target=test_concurrency)
t1.start()
t2.start()
t1.join()
t2.join()
После запуска теста и уничтожения тестовой базы данных появляется следующая ошибка:
psycopg2.errors.ObjectInUse: database "test_db" is being accessed by other users
DETAIL: There are 2 other sessions using the database.
Я попытался вручную закрыть соединения в конце теста, добавив:
for conn in db.connections.all():
conn.close()
Но, похоже, это не имеет никакого эффекта.
Я использую django.test.TransactionTestCase
в качестве базового класса TestCase, Django 2.2
и PostgreSQL 10.6
.