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

时间:2016-04-13 14:24:01

标签: python concurrency celery cx-oracle

我正在使用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会让其他任务等到第一个工作人员完成运行吗?如果不是,那么只有在没有其他工作者使用数据库连接对象时,我才能允许每个工作者使用数据库连接对象?

1 个答案:

答案 0 :(得分:1)

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

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