Mi piace l'idea di tigeronk2 di una connessione per lavoratore. Come dice lui, Celery mantiene il proprio pool di lavoratori, quindi non c'è davvero bisogno di un pool di connessioni al database separato. I documenti di Celery Signal spiegano come eseguire l'inizializzazione personalizzata quando viene creato un lavoratore, quindi ho aggiunto il seguente codice al mio task.py e sembra funzionare esattamente come ti aspetteresti. Sono stato anche in grado di chiudere le connessioni quando i lavoratori sono stati interrotti:
from celery.signals import worker_process_init, worker_process_shutdown
db_conn = None
@worker_process_init.connect
def init_worker(**kwargs):
global db_conn
print('Initializing database connection for worker.')
db_conn = db.connect(DB_CONNECT_STRING)
@worker_process_shutdown.connect
def shutdown_worker(**kwargs):
global db_conn
if db_conn:
print('Closing database connectionn for worker.')
db_conn.close()