Celery Worker 数据库连接池

2024-01-12

我正在独立使用 Celery(不在 Django 中)。我计划让一种工作任务类型在多台物理机器上运行。该任务执行以下操作

  1. 接受 XML 文档。
  2. 改造它。
  3. Make multiple数据库读取和写入。

我正在使用 PostgreSQL,但这同样适用于使用连接的其他存储类型。过去,我使用数据库连接池来避免在每个请求上创建新的数据库连接或避免连接打开时间过长。然而,由于每个 Celery 工作线程都在单独的进程中运行,我不确定他们实际上如何能够共享池。我错过了什么吗?我知道 Celery 允许您保留从 Celery 工作人员返回的结果,但这不是我在这里想要做的。每个任务可以根据处理的数据执行多个不同的更新或插入。

从 Celery Worker 内部访问数据库的正确方法是什么?

是否可以在多个工作人员/任务之间共享一个池,或者是否有其他方法可以做到这一点?


我喜欢 Tigeronk2 每个工作人员一个连接的想法。正如他所说,Celery 维护自己的工作池,因此实际上不需要单独的数据库连接池。这Celery 信号文档 http://docs.celeryproject.org/en/latest/userguide/signals.html#worker-signals解释如何在创建工作人员时进行自定义初始化,因此我将以下代码添加到我的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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Celery Worker 数据库连接池 的相关文章

随机推荐