Tôi thích ý tưởng của tigeronk2 về một kết nối cho mỗi nhân viên. Như anh ấy nói, Celery duy trì nhóm nhân viên của riêng mình vì vậy thực sự không cần phải có một nhóm kết nối cơ sở dữ liệu riêng biệt. Tài liệu về Celery Signal giải thích cách thực hiện khởi tạo tùy chỉnh khi một worker được tạo, vì vậy tôi đã thêm mã sau vào task.py của mình và nó có vẻ hoạt động chính xác như bạn mong đợi. Tôi thậm chí có thể đóng các kết nối khi công nhân ngừng hoạt động:
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()