Podoba mi się pomysł tigeronk2 dotyczący jednego połączenia na pracownika. Jak mówi, Celery utrzymuje własną pulę pracowników, więc tak naprawdę nie ma potrzeby tworzenia oddzielnej puli połączeń z bazą danych. Dokumentacja Celery Signal wyjaśnia, jak wykonać niestandardową inicjalizację, gdy tworzony jest pracownik, więc dodałem następujący kod do mojego task.py i wydaje się, że działa dokładnie tak, jak można się spodziewać. Udało mi się nawet zamknąć połączenia, gdy pracownicy są zamknięci:
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()