Bri*_* C. 5 python sqlalchemy flask python-3.x flask-sqlalchemy
我想将 sqlalchemy 池大小设置为默认值以外的值。
我有一个烧瓶应用程序。我使用 app.config.from_pyfile('config.py') 从文件文件设置配置
在初始化数据库之前,我已经转储了配置,其中包括:
'SQLALCHEMY_DATABASE_URI': 'mysql://readonly:password@localhost/xyz',
'SQLALCHEMY_ECHO': False,
'SQLALCHEMY_MAX_OVERFLOW': 0,
'SQLALCHEMY_POOL_SIZE': 1,
'SQLALCHEMY_RECORD_QUERIES': False,
'SQLALCHEMY_TRACK_MODIFICATIONS': False,
Run Code Online (Sandbox Code Playgroud)
加载配置并执行转储后,我们立即调用一些代码,例如:
db: SQLAlchemy = SQLAlchemy()
db.init_app(app)
Run Code Online (Sandbox Code Playgroud)
我在 apache 上使用 mod_python 运行这个程序,其中有一个进程和一个线程。我在 httpd.conf 中使用它
WSGIDaemonProcess browse user=busybody group=busybody processes=1 threads=1 lang='en_US.UTF-8' locale='en_US.UTF-8' python-home=/users/x/virtualenvs/browse-wfalcMKM home=/users/x/browse
WSGIScriptAlias /abs /users/e-prints/browse/wsgi.py/abs
Run Code Online (Sandbox Code Playgroud)
然后我用 siege 和 100 个并发连接来锤炼这个。
我在 mysql SHOW PROCESSLIST 中为用户“readonly”获取了 20 个进程;我期望在显示进程列表中看到用户“只读”的 1 个进程;
没有其他应用程序使用用户“只读”,当我停止 httpd/python/flask 应用程序时,显示进程列表中有零个“只读”用户;
我希望按照我在此处的文档中尝试的方式配置事物:http://flask-sqlalchemy.pocoo.org/2.3/config/
我正在使用 python 3.6 和 mysql 5.1.73。看来我有 Flask_SQLAlchemy 2.3.2、mysqlclient 1.3.13 和 SQLAlchemy 1.2.12。这是在linux上的。Apache 与 mod-wsgi 4.5.15。
更新:
我添加了一个调试,我看到 db.engine.pool.size 设置为我期望的值。
我不确定这是否是它应该如何工作,但我发现我在不同的请求中得到了不同的池对象:
[Mon Oct 29 12:17:25 2018] - ERROR: "pool size = 1"
[Mon Oct 29 12:17:25 2018] - ERROR: "engine object = Engine(mysql://browse_readonly:***@localhost/arXiv?charset=utf8)"
[Mon Oct 29 12:17:25 2018] - ERROR: "pool object = <sqlalchemy.pool.QueuePool object at 0x7f2342b97da0>"
[Mon Oct 29 12:17:35 2018] - ERROR: "pool size = 1"
[Mon Oct 29 12:17:35 2018] - ERROR: "engine object = Engine(mysql://browse_readonly:***@localhost/arXiv?charset=utf8)"
[Mon Oct 29 12:17:35 2018] - ERROR: "pool object = "sqlalchemy.pool.QueuePool object at 0x7f2342b39400>"
Run Code Online (Sandbox Code Playgroud)
更新 2:我正在使用 apache 和 mod-python。我将其添加到上面问题的正文中。更新 3:我的错误,我们正在使用 mod-wsgi。
您正确设置了池大小。但几乎可以肯定,您有多个独立的 WSGI 进程:
我不确定这是否是它应该如何工作,但我发现我在不同的请求中得到了不同的池对象:
Run Code Online (Sandbox Code Playgroud)[...] [Mon Oct 29 12:17:25 2018] - ERROR: "pool object = <sqlalchemy.pool.QueuePool object at 0x7f2342b97da0>" [...] [Mon Oct 29 12:17:35 2018] - ERROR: "pool object = "sqlalchemy.pool.QueuePool object at 0x7f2342b39400>"
Flask-SQLAlchemy 在每个 Flask 应用程序设置中使用简单的单引擎和一个池,这是您可以QueuePool通过拥有多个实例来拥有多个Flask实例的唯一方法,除了更奇特的多应用程序设置之外,这意味着您正在为应用程序提供服务多进程 WSGI 服务器。
WSGI 服务器通常使用多个工作进程以及线程来扩展性能。每个工作进程都是独立的,有自己的Flask实例,每个实例都有自己的 SQLAlchemy 引擎和池。这取决于您具体的 WSGI 服务器如何将其配置为仅使用线程。
否则,单独的进程需要自己的 MySQL 连接是正常的。