Saya suka ide tigeronk2 tentang satu koneksi per pekerja. Seperti yang dia katakan, Celery memelihara kumpulan pekerjanya sendiri sehingga sebenarnya tidak diperlukan kumpulan koneksi database yang terpisah. Dokumen Celery Signal menjelaskan cara melakukan inisialisasi khusus saat pekerja dibuat, jadi saya menambahkan kode berikut ke task.py saya dan tampaknya berfungsi persis seperti yang Anda harapkan. Saya bahkan bisa menutup koneksi saat pekerja dimatikan:
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()