Как уменьшить количество соединений, создаваемых многопоточным запросом Django?
Мой проект устроен примерно так
thread_pool = ThreadPoolExecutor()
def my_background_thread(model: MyModel):
# Other DB Reads here
...
# Some long running action here, spawning several threads
...
# Save result of action to DB
model.field = val
model.save()
# Other DB writes
...
def my_view(request):
model = MyModel.objects.get(...)
thread_pool.submit(my_background_thread, model)
# Return before thread has completed
return HttpResponse("success")
К сожалению, из-за того, как я его настроил, Django создает слишком много соединений с БД - больше, чем нужно, и превышает мои лимиты БД.
Некоторые непонятные моменты:
- Когда я передаю модель новому потоку, создается ли в этот момент новое соединение? Создается ли новое соединение только при чтении/записи в модель? Только когда я пишу?
- Как проверить количество открытых соединений или показать, когда создается соединение?
Короче говоря, как я могу предотвратить создание Django слишком большого количества соединений в этом сценарии?
EDIT: Чтобы уточнить, проблема в том, что узким местом должна быть многопоточная работа, связанная с IO, а нагрузка на БД должна быть относительно небольшой по сравнению с этим. Однако Django открывает слишком много соединений и/или сохраняет их дольше, чем следует, что и приводит к снижению нагрузки на IO.