gpt4 book ai didi

python - 无法设置 Flask_sqlalchemy 的池大小

转载 作者:行者123 更新时间:2023-12-01 01:29:34 27 4
gpt4 key购买 nike

我想将 sqlalchemy 池大小设置为默认值以外的值。

我有一个 flask 应用程序。我使用以下命令从文件文件设置配置 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,

加载配置并执行转储后,我们将调用一些代码,例如:

db: SQLAlchemy = SQLAlchemy()
db.init_app(app)

我在 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

然后我用 siege 和 100 个并发连接来锤炼这个。

我在 mysql SHOW PROCESSLIST 中为用户“readonly”获取了 20 个进程;我期望在 SHOW PROCESSLIST 中看到用户“只读”的 1 个进程;

没有其他应用程序使用用户“readonly”,当我停止 httpd/python/flask 应用程序时,SHOW PROCESSLIST 中有零个“readonly”用户;

我希望按照我在此处文档中尝试的方式配置事物: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>"

更新 2:我正在使用 apache 和 mod-python。我将其添加到上面问题的正文中。更新 3:我的错误,我们正在使用 mod-wsgi。

最佳答案

您正确设置了池大小。但几乎可以肯定您有多个独立的 WSGI 进程:

I'm not sure if this is how it is supposed to work but I see that I'm getting different pool objects in different requests:

[...]  
[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 应用程序设置中使用简单的单引擎和一个池,这是您可以通过拥有多个 Flask 来拥有多个 QueuePool 实例的唯一方法> 实例,在更奇特的多应用程序设置之外意味着您在多进程 WSGI 服务器中提供应用程序。

WSGI 服务器通常使用多个工作进程以及线程来扩展性能。每个工作进程都是独立的,并拥有自己的 Flask 实例,每个实例都有自己的 SQLAlchemy 引擎和池。这取决于您具体的 WSGI 服务器如何将其配置为仅使用线程。

单独的进程需要自己的 MySQL 连接是正常的。

关于python - 无法设置 Flask_sqlalchemy 的池大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53013035/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com