【问题标题】:How to initialize MongoClient in a multiprocess Flask application?如何在多进程 Flask 应用程序中初始化 MongoClient?
【发布时间】:2021-10-07 22:46:07
【问题描述】:

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

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

问题是更改后我的测试失败了,因为 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

【问题讨论】:

    标签: python flask uwsgi


    【解决方案1】:

    还有其他简单的方法可以为每个进程初始化一个 MongoClient 吗?

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

    该函数具有保护措施,以确保每个进程都有自己的客户端。

    _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
    

    如果没有,我该如何测试我的 app.py?

    你可以使用像这样的警卫

    try:
        from uwsgi import postfork
    except ImportError:
        postfork = lambda f: f  # no-op decorator
    

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

    【讨论】:

      猜你喜欢
      • 2018-10-21
      • 2013-03-24
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      • 2013-07-02
      • 2015-07-26
      • 1970-01-01
      • 2020-12-13
      相关资源
      最近更新 更多