同步Celery任务共享一个公共对象(数据库连接)



我正在使用Python、Celery和cx_Oracle。

我召集了一群工人。这些工作者共享一个数据库连接对象。

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

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

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

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

芹菜会自动处理这些事情吗?我的意思是,如果一个任务正在使用数据库连接对象,Celery会让任何其他任务等待第一个工作者完成运行吗?如果没有,那么只有在没有其他工作人员使用数据库连接对象的情况下,我才能允许每个工作人员使用该对象?

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

是否有真正的原因需要在工作人员之间共享此数据库连接?每个芹菜工作者一个数据库连接实现起来更简单,维护起来更容易,不容易出现错误,并且可以更好地控制打开/关闭连接。然后,您可以在python中处理并发问题,而不是希望您的数据库连接能够以正确的顺序通过。

相关内容

最新更新