如何在Celery worker中正确连接到mongodb?

2024-09-21 07:50:35 发布

您现在位置:Python中文网/ 问答频道 /正文

学习芹菜,阅读Celery Best Practices,并有一个关于芹菜数据库用法的简单问题。在

丹尼·贝尔托维奇说:

You shouldn't pass Database objects (for instance your User model) to a background task because the serialized object might contain stale data.

因此,如果我想连接到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

或者:

^{pr2}$

是吗?在

UPD:我可以在每个任务结束时close()我的mongodb连接,所以每次我需要东西时,任务都会连接到新的数据库,不会浪费资源。不过,我是否需要多次打开/关闭数据库连接?或者我可以连接一次并刷新连接以检索数据库的新版本?在


Tags: clientyou数据库用法taskdbmongodbpass
1条回答
网友
1楼 · 发布于 2024-09-21 07:50:35

打开/关闭每个事务的数据库连接可以避免由于过时或不正确的数据而导致的错误,因为事务是独立执行的。同时简化了数据库事务的生命周期管理。在

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

@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

相关问题 更多 >

    热门问题