如何在多进程 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'
问题:
- 有没有其他简单的方法来为每个进程初始化一个
MongoClient
?
- 如果没有,我该如何测试我的
app.py
?
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 外部调用。
我有一个 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'
问题:
- 有没有其他简单的方法来为每个进程初始化一个
MongoClient
? - 如果没有,我该如何测试我的
app.py
?
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 外部调用。