Líbí se mi myšlenka tigeronk2 o jednom připojení na pracovníka. Jak říká, Celery má svůj vlastní fond pracovníků, takže ve skutečnosti není potřeba samostatný fond pro připojení k databázi. Dokumenty Celery Signal vysvětlují, jak provést vlastní inicializaci, když je vytvořen pracovník, takže jsem přidal následující kód do svého task.py a zdá se, že funguje přesně tak, jak byste očekávali. Dokonce se mi podařilo uzavřít spojení, když jsou pracovníci vypnuti:
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()