首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法为Flask_sqlalchemy设置池大小

无法为Flask_sqlalchemy设置池大小
EN

Stack Overflow用户
提问于 2018-10-26 16:38:28
回答 2查看 5.2K关注 0票数 4

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

我有一个烧瓶应用程序。我使用app.config.from_pyfile('config.py')从文件文件中设置配置

在初始化db之前,我已经转储了配置,它包括:

代码语言:javascript
运行
复制
'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, 

在加载配置并执行转储操作之后,我们将调用如下代码:

代码语言:javascript
运行
复制
db: SQLAlchemy = SQLAlchemy()
db.init_app(app)

我用一个进程和一个线程在apache上运行mod_python。我在httpd.conf里用这个

代码语言:javascript
运行
复制
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

然后我用围城和100个并发的连接来敲击它。

我在mysql显示PROCESSLIST中获得了20个用户“只读”进程;我希望看到的是显示PROCESSLIST中用户“只读”的一个进程;

没有其他应用程序使用用户“readonly”,当我停止httpd/python/烧瓶应用程序时,在节目PROCESSLIST中没有任何“只读”用户;

我的希望是按照我在这里尝试的方式来配置东西: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设置为我所期望的那样。

我不确定它是否应该这样工作,但我看到在不同的请求中得到了不同的池对象:

代码语言:javascript
运行
复制
[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和。我在上述问题的正文中补充了这一点。更新3:我的错误,我们使用的是mod。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-30 12:03:48

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

我不确定它是否应该这样工作,但我看到在不同的请求中得到了不同的池对象: -错误:“池对象= ”.-错误:"sqlalchemy.pool.QueuePool对象=“sqlalchemy.pool.QueuePool object at 0x7f2342b39400>”

烧瓶-SQLAlchemy使用一个简单的一个引擎和一个池的方式来安装一个QueuePool应用程序,只有这样,你才能通过拥有多个Flask实例来拥有多个Flask实例,这意味着你在一个多进程的WSGI服务器上为应用提供服务。

WSGI服务器通常使用多个工作进程与线程一起提高性能。每个工作进程都是独立的,并有自己的Flask实例,每个实例都有自己的SQLAlchemy引擎和池。这取决于您确切的WSGI服务器,您将如何将其配置为只使用线程。

否则,单独的进程需要自己连接到MySQL,这是正常的。

票数 5
EN

Stack Overflow用户

发布于 2018-10-27 21:25:56

在引擎创建时,绝对可以使用

代码语言:javascript
运行
复制
app.config['SQLALCHEMY_POOL_SIZE'] = 1
db = SQLAlchemy(app)

这可以被证实是与

代码语言:javascript
运行
复制
print("pool size = {}".format(db.engine.pool.size()))

一些配置参数在引擎创建后无法更改,因此问题可能是您正在使用db = SQLAlchemy()创建引擎,然后再应用配置。然而,这并不是整个故事的全部,因为默认池大小是5,如果您看到20个并发连接,那么肯定会有其他事情发生。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53013035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档