Этот вопрос проверяет понимание разницы между управлением памятью (GIL) и управлением внешними ресурсами (соединениями с БД).
Нет, GIL не закрывает соединения с базой данных при аварийном завершении задачи. GIL отвечает только за синхронизацию доступа к объектам Python и не управляет внешними ресурсами. Соединения с БД должны закрываться явно или через контекстные менеджеры. При аварийном завершении потока соединение может остаться открытым, что приведет к утечке ресурсов на стороне базы данных. Для предотвращения этого следует использовать блоки try-finally или контекстные менеджеры для гарантированного закрытия соединений.
GIL и управление соединениями с базами данных — это разные уровни абстракции, которые решают разные задачи.
GIL работает на уровне интерпретатора Python: Контролирует выполнение байткода
Соединения с БД — внешние ресурсы: Управляются драйверами базы данных и операционной системой
Разные домены ответственности: GIL не отслеживает состояние сетевых соединений или файловых дескрипторов
import sqlite3
import threading
def database_operation():
# НЕПРАВИЛЬНО - соединение может не закрыться при ошибке
conn = sqlite3.connect('test.db')
try:
cursor = conn.cursor()
cursor.execute("SELECT * FROM non_existent_table") # Вызовет ошибку
conn.commit()
finally:
conn.close() # Гарантированное закрытие
# Лучше использовать контекстный менеджер
def safe_database_operation():
with sqlite3.connect('test.db') as conn:
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")Соединение остается открытым на стороне базы данных
Возможна утечка ресурсов (память, дескрипторы)
Пулы соединений могут исчерпаться при многократных ошибках
Вывод: Разработчик должен самостоятельно управлять жизненным циклом внешних ресурсов, таких как соединения с БД. GIL не предоставляет никаких гарантий относительно их освобождения. Всегда используйте контекстные менеджеры или блоки try-finally для работы с внешними ресурсами.