python - 同时 Celery 任务共享一个公共(public)对象(数据库连接)

标签 python concurrency celery cx-oracle

我正在使用 Python、Celery 和 cx_Oracle。

我启动了一群 worker 。这些工作人员共享一个数据库连接对象。

这就是我创建数据库连接对象 (db_conn) 的方法。请注意 threaded=True 参数:

db_conn = cx_Oracle.connect(user=db_user,
                            password=db_password,
                            dsn=dsn,
                            threaded=True)

这些工作人员运行的任务主要包括执行一些需要几秒钟才能完成的查询。多个工作人员在时间上重叠(并发)的机会相当高。

我的问题是:共享数据库连接对象(db_conn)时我应该采取什么特殊措施吗?

Celery 会自动处理这些事情吗?我的意思是,如果一个任务正在使用数据库连接对象,Celery 会让其他任务等到第一个工作程序完成运行吗?如果不是,那么我如何允许每个工作人员仅在没有其他工作人员使用数据库连接对象时使用它?

最佳答案

我会确保您知道其中一个查询失败时会发生什么。每个新查询是否都会启动自己的事务?您需要确保数据库连接在完成后正确关闭,但在此之前不要关闭。

您需要在工作人员之间共享此数据库连接是否有真正的原因?每个 celery Worker 一个数据库连接更容易实现,更容易维护,更不容易出现错误,并且可以让您更好地控制打开/关闭连接。然后你可以处理 python 中的并发问题,而不是希望你的数据库连接让事情按正确的顺序进行。

关于python - 同时 Celery 任务共享一个公共(public)对象(数据库连接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36601418/

相关文章:

python - re.sub 无法执行 - 即使找到正则表达式模式?

python - "cannot find the input table or query"SELECT 语句错误

java - 数组的并发问题(Java)

java - Spring 中的自定义电子邮件服务 - 需要帮助改进

Python:比较不同 bin 大小的直方图

java - 无法解决与Java Threads相关的教科书示例

macos - Celery 未在 OS X 中启动 - dbm.error : db type is dbm. gnu,但该模块不可用

python - 是否可以仅在我的项目中使用 Django 模型模块?

python - 在 celery 中获取 task_id

python - 带有python的ssl客户端服务器