Django; ThreadPoolExecutor вызывает FATAL; извините, слишком много клиентов
Я знаю, что эта ошибка уже была опубликована, но контекст моей проблемы отличается. Я безуспешно пробовал предложенные решения.
Я использую django-apscheduler для планирования некоторых команд управления, одна из них использует ThreadPoolExecutor
для ускорения длительного процесса.
К сожалению, он не закрывает соединения, что в конечном итоге приводит к:
exception:connection to server at "localhost" (::1), port 5432 failed: FATAL: sorry, too many clients already
Я использую PostgreSQL backend, и когда я запускаю команду управления напрямую, я вижу в pgAdmin, что количество сессий базы данных уменьшается после выполнения.
Однако при выполнении django-apscheduler они накапливаются и в конечном итоге вызывают FATAL: sorry, too many clients already
.
Я пробовал вызывать close_old_connections()
из from django.db import close_old_connections
, но это, похоже, ничего не дает.
Может ли кто-нибудь указать мне правильное направление?
Вот как выглядит моя команда управления:
import concurrent
from django.core.management.base import BaseCommand
from data_model.models import DataModel
class Command(BaseCommand):
help = "Do something interesting"
def handle(self, *args, **kwargs):
with concurrent.futures.ThreadPoolExecutor(10) as executor:
list(executor.map(DataModel.objects.do_something_interesting))
Я также попробовал добавить время истечения срока действия CONN_MAX_AGE
в конфигурацию DB, но это не помогло:
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql_psycopg2",
"NAME": env.str("POSTGRES_DB"),
"USER": env.str("POSTGRES_USER"),
"PASSWORD": env.str("POSTGRES_PASSWORD"),
"HOST": env.str("POSTGRES_HOST"),
"PORT": 5432,
"CONN_MAX_AGE": 60
},
}
Выполнение команды управления завершено, где стрелка: