Я работаю над командой manage.py, которая создает около 200 потоков для проверки удаленных хостов. Моя база данных позволяет мне использовать 120 соединений, поэтому мне нужно использовать какой-то пул. Я пытался использовать отдельную тему, как это
class Pool(Thread):
def __init__(self):
Thread.__init__(self)
self.semaphore = threading.BoundedSemaphore(10)
def give(self, trackers):
self.semaphore.acquire()
data = ... some ORM (not lazy, query triggered here) ...
self.semaphore.release()
return data
Я передаю экземпляр этого объекта каждому контрольному потоку, но все еще получаю «OperationalError: FATAL: извините, слишком много клиентов уже» внутри объекта Pool после запуска 120 потоков.
Я ожидал, что будет открыто только 10 соединений с базой данных, и потоки будут ждать свободного слота семафора. Я могу проверить, что семафор работает, комментируя "release ()", в этом случае будут работать только 10 потоков, а другие будут ждать завершения приложения.
Насколько я понимаю, каждый поток открывает новое соединение с базой данных, даже если фактический вызов находится внутри другого потока, но почему? Есть ли способ выполнить все запросы к базе данных только в одном потоке?