如何在多进程 Flask 应用程序中初始化 MongoClient?

How to initialize MongoClient in a multiprocess Flask application?

我有一个 Flask 应用程序,我是 运行 uWSGI。应用程序初始化 MongoClient()。当 运行 uWSGI 有多个工作人员时,我收到 MongoClient opened before fork 警告。

我看到克服这个问题的一种方法是在用 uWSGI 装饰的初始化方法中初始化 MongoClient @postfork

问题是在更改后我的测试失败了,因为 pytest 找不到 uwsgi

#15 1.880 usr/local/lib/python3.9/site-packages/uwsgidecorators.py:10: in <module>
#15 1.880     import uwsgi
#15 1.880 E   ModuleNotFoundError: No module named 'uwsgi'

问题:

Is there any other easy way to initialize a MongoClient for each process?

无论您在哪里使用该客户端,都可以使用一个函数来获取它,如下所示。

该函数有守卫以确保每个进程都有自己的客户端。

_mongo_client = None
_mongo_client_pid = None


def get_mongoclient():
    global _mongo_client, _mongo_client_pid
    if os.getpid() != _mongo_client_pid:
        _mongo_client = MongoClient(...)
        _mongo_client_pid = os.getpid()
    return _mongo_client

If not, how can I test my app.py?

你可以使用像

这样的守卫
try:
    from uwsgi import postfork
except ImportError:
    postfork = lambda f: f  # no-op decorator

使您的应用程序在使用和不使用 uwsgi 的情况下都能正常工作。 @postfork 标记的代码不会在 uwsgi 外部调用。