Харесва ми идеята на tigeronk2 за една връзка на работник. Както той казва, Celery поддържа свой собствен пул от работници, така че наистина няма нужда от отделен пул за връзка с база данни. Документите за Celery Signal обясняват как да направите персонализирана инициализация, когато е създаден работник, така че добавих следния код към моя tasks.py и изглежда работи точно както бихте очаквали. Дори успях да затворя връзките, когато работниците са изключени:
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()