django - Django 测试用例中的线程没有关闭数据库连接
问题描述
我正在尝试测试我为防止竞争条件而设置的代码是否有效。
在我的测试用例中,我启动了两个线程并让它们都调用有问题的代码。线程正常返回,但似乎 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
.
解决方案
用更多的谷歌搜索来解决这个问题。Django 中的线程需要在线程执行后手动关闭数据库连接。
子类线程:
from django.db import connection
from threading import Thread
class TestThread(Thread):
def run(self):
super().run()
connection.close()
推荐阅读
- regex - 为什么我的正则表达式没有抓住前缀的最后一个字符?
- cookies - 如何配置 Varnish 根据 Vary 响应标头有条件地忽略 cookie?
- python-3.x - 如何获取在 Pandas DataFrame 的最后一行中具有特定值的所有索引?
- python - 安装 Py3ODE (Win10) 时出错
- javascript - 为什么图书馆的主要对象经常以大写字母开头?
- python - Log 的 Snakemake 问题
- python-2.7 - 如何显示正在使用的 google-cloud-bigquery 版本?
- algorithm - Peak removal/interpolation
- jenkins - 在 jenkins 中使用 groovy 发布到 AWS SNS 主题
- python - 使用正则表达式从 xml 标签中删除选择的字符