Lavoro sul comando manage.py che crea circa 200 thread per controllare gli host remoti. La configurazione del mio database mi consente di utilizzare 120 connessioni, quindi ho bisogno di utilizzare un qualche tipo di pool. Ho provato con filo separato, come questoUtilizzo di Django ORM nei thread ed evitando l'eccezione "too many clients" utilizzando BoundedSemaphore
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
passo istanza di questo oggetto per ogni thread check-, ma ancora ottenere "OperationalError: FATAL: sorry, troppi clienti già" dentro oggetto Pool dopo init-ing 120 fili. Mi aspetto che verranno aperte solo 10 connessioni al database e che i thread attenderanno lo slot del semaforo gratuito. Posso controllare che il semaforo funzioni commentando "release()", in tal caso solo 10 thread funzioneranno e altri attenderanno fino alla terminazione dell'app.
Per quanto ho capito, ogni thread apre una nuova connessione al database anche se la chiamata effettiva è all'interno di thread diversi, ma perché? C'è un modo per eseguire tutte le query del database all'interno di un solo thread?
Per trovare il problema del DB effettivo, suppongo che abbiamo bisogno di più codice sql. Ma, perché non raccogli l'intero thread in modo da eseguire solo circa 20-30 in quel momento? – KillianDS
Ciao, il mio problema è che Django crea una connessione per ogni thread che tocchi qualsiasi codice ORM, anche se la vera manipolazione ORM avviene in thread diversi. (L'ho controllato rimuovendo tutto il codice da altri thread tranne che per la chiamata all'istanza di Pool give). Quindi nel mio caso non c'è SQL tranne che per ottenere dati in give. Finché ho il correttore di classe (Discussione): def run (self): self.getter.give (self.trackers) viene creata una connessione (i tracker sono una lista di stringhe qui). E dopo aver raggiunto il limite di 120 connessioni il mio database inizia a dare eccezioni. – Riz
btw, sono stato in grado di risolvere questo problema in un modo - chiudendo manualmente la connessione dopo ogni richiesta db, le prestazioni sono accettabili, ma sono ancora curioso di conoscere questo problema. – Riz