如何正确连接到芹菜工人的mongodb?

时间:2017-12-19 07:49:30

标签: python mongodb celery pymongo celery-task

学习Celery,阅读Celery Best Practices,并对Celery的数据库使用情况提出了一个非常简单的问题。

Deni Bertovic说:

  

您不应该将数据库对象(例如您的用户模型)传递给   后台任务,因为序列化对象可能包含陈旧   数据

因此,如果我想连接到worker中的数据库,那么正确的选择是什么:

@app.task
def add(x, y, collection):
    client = MongoClient('mongodb://localhost:27017/')
    db = client.wakawaka
    db[collection].insert_one({'sum':x+y})
    return True

或:

client = MongoClient('mongodb://localhost:27017/')
db = client.wakawaka

@app.task
def add(x, y, collection):
    db[collection].insert_one({'sum':x+y})
    return True

UPD:我可以在每项任务结束时close()我的mongodb连接,所以每次我需要的时候,任务都会连接到新的数据库,而且没有资源浪费。但是,我需要多次打开/关闭数据库连接吗?或者我可以连接一次并以某种方式刷新连接以检索新版本的DB?

1 个答案:

答案 0 :(得分:1)

每个事务打开/关闭数据库连接可以避免由于事务独立执行而导致数据陈旧或不正确导致的错误。此外,还简化了数据库事务的生命周期管理。

您可以在连接上下文管理器块中编写事务。这会处理关闭连接,因此无需显式关闭连接。它也是线程安全的。您还可以利用内置连接池在出现异常时重试。

@app.task
def add(x, y, collection):
    with MongoClient('mongodb://localhost:27017') as connection:
        db = connection.db
        db.collection.insert_one({'sum':x+y})
    return True