Потоки в тестовом примере Django не закрывают соединения с БД - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь проверить, работает ли код, введенный мной для предотвращения условий гонки.

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

1 Ответ

0 голосов
/ 13 июня 2019

Понял это с немного большим количеством поиска в Google.Потоки в Django должны быть закрыты вручную после выполнения потока.

Поток подкласса:

from django.db import connection
from threading import Thread

class TestThread(Thread):

    def run(self):
        super().run()

        connection.close()
...