PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Celery Worker Database Connection Pooling

Ich mag die Idee von tigeronk2 von einer Verbindung pro Arbeiter. Wie er sagt, unterhält Celery seinen eigenen Pool von Arbeitern, so dass es wirklich keinen Bedarf an einem separaten Pool für Datenbankverbindungen gibt. In den Celery Signal-Dokumenten wird erklärt, wie eine benutzerdefinierte Initialisierung durchgeführt wird, wenn ein Worker erstellt wird. Daher habe ich meiner Tasks.py den folgenden Code hinzugefügt, und es scheint genau so zu funktionieren, wie Sie es erwarten würden. Ich war sogar in der Lage, die Verbindungen zu schließen, wenn die Arbeiter heruntergefahren sind:

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()