Невозможно установить размер пула для Flask_sqlalchemy - PullRequest
0 голосов
/ 26 октября 2018

Я хотел бы установить размер пула 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, 

Сразу после загрузки конфигурации и выполнения этого дампа мы вызываем некоторый код, например:

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

Затем я забиваю это осадой и 100 одновременными соединениями.

Я получаю 20 процессов для пользователя «только для чтения» в mysqlШОУ ПРОЦЕССЛИСТ;Я ожидаю увидеть 1 процесс для пользователя «только для чтения» в SHOW PROCESSLIST;

Нет других приложений, использующих пользователя «только для чтения», и когда я останавливаю приложение httpd / python / flask, их ноль'readonly' пользователи в SHOW 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 настроен на то, что я ожидаю.

Я не уверен, как это должно работать, но я вижу, что я получаю разные объекты пула в разных запросах:

[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.

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Вы правильно устанавливаете размер пула. Но у вас почти наверняка есть несколько отдельных процессов WSGI :

Я не уверен, как это должно работать, но я вижу, что я получаю разные объекты пула в разных запросах:

[...]  
[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.

0 голосов
/ 28 октября 2018

Определенно возможно установить CONNECTION_POOL_SIZE во время создания движка с помощью

app.config['SQLALCHEMY_POOL_SIZE'] = 1
db = SQLAlchemy(app)

Это может быть подтверждено, что оно работало с

print("pool size = {}".format(db.engine.pool.size()))

Некоторые параметры конфигурации не могут бытьизменилось после создания движка, поэтому проблема может заключаться в том, что вы создаете движок с db = SQLAlchemy(), а затем применяете конфигурацию впоследствии.Однако это еще не все, так как размер пула по умолчанию равен 5, и должно быть что-то еще, если вы видите 20 одновременных подключений.

...