Ich arbeite mit dem Befehl manage.py, der etwa 200 Threads erstellt, um entfernte Hosts zu überprüfen. Mein Datenbank-Setup erlaubt mir 120 Verbindungen, also muss ich eine Art von Pooling verwenden. Ich habe versucht, getrennte Threads zu verwenden, wie diesen
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
Ich übergebe die Instanz dieses Objekts an jeden Prüf-Thread, erhalte aber immer noch "OperationalError: FATAL: sorry, too many clients already" innerhalb des Pool-Objekts nach der Initiierung von 120 Threads. Ich habe erwartet, dass nur 10 Datenbankverbindungen geöffnet werden und die Threads auf einen freien Semaphor-Slot warten. Ich kann überprüfen, ob der Semaphor funktioniert, indem ich "release()" kommentiere. In diesem Fall werden nur 10 Threads arbeiten und die anderen werden bis zur Beendigung der Anwendung warten.
Soviel ich weiß, öffnet jeder Thread eine neue Verbindung zur Datenbank, auch wenn der eigentliche Aufruf in einem anderen Thread erfolgt, aber warum? Gibt es eine Möglichkeit, alle Datenbankabfragen in nur einem Thread durchzuführen?