11 Stimmen

Verwendung von Django ORM in Threads und Vermeidung der Ausnahme "zu viele Clients" durch Verwendung von BoundedSemaphore

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?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X