J'aime l'idée de Tigeronk2 d'une connexion par travailleur. Comme il le dit, Celery maintient son propre pool de travailleurs, il n'y a donc pas vraiment besoin d'un pool de connexion de base de données séparé. Les documents Celery Signal expliquent comment effectuer une initialisation personnalisée lors de la création d'un travailleur. J'ai donc ajouté le code suivant à mon tasks.py et il semble fonctionner exactement comme prévu. J'ai même pu fermer les connexions lorsque les travailleurs sont arrêtés :
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()