私は、ワーカーごとに1つの接続という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()