Eu gosto da ideia do tigeronk2 de uma conexão por trabalhador. Como ele diz, o Celery mantém seu próprio pool de trabalhadores, de modo que não há necessidade de um pool de conexão de banco de dados separado. Os documentos do Celery Signal explicam como fazer a inicialização personalizada quando um trabalhador é criado, então adicionei o seguinte código ao meu tasks.py e parece funcionar exatamente como você esperaria. Consegui até fechar as conexões quando os trabalhadores são desligados:
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()