Делаю свое первое большое приложение на Python: Flask + SQL Alchemy
База данных MySQL.
Суть в том, что внутри приложения создаются задания. Каждое задание работает в многопоточном режиме.
Внутри каждого потока происходит множество чтений и записей в БД.
Проблема в том, что при достаточно большом количестве поток (50+) MySQL просто умирает.
Важный момент в том, что каждое задание запускается в отдельном процессе. Внутри процесса уже создаются потоки.
Я не могу понять, где именно узкое место. Выполняются простые операции по чтению-записи данных. Объемы данных не большие.
Руководствуясь своим прошлым обширным опытом на PHP, я знаю, что MySQL должна легко выдерживать подобные нагрузки.
Настройки SQL Alchemy:
SQLALCHEMY_TRACK_MODIFICATIONS = True
SQLALCHEMY_POOL_SIZE = 20
SQLALCHEMY_MAX_OVERFLOW = 5
SQLALCHEMY_POOL_RECYCLE = 5
Создаю объект db:
db = SQLAlchemy(app)
Дальше я его импортирую и использую в других скриптах.
Мне кажется, не правильно я делаю в некоторых местах.
Например, мне нужно в режиме реального времени сделать инкремент значения в БД. Это единственный рабочий вариант кода:
db.session.commit()
task = Task.query.filter_by(id=self.task.id).first()
db.session.query(Task).filter_by(id=self.task.id).update({'progress': task.progress + 1})
db.session.commit()
Ключевой вопрос: как правильно организовать работу с подобным приложением на SQL Alchemy?
Как правильно использовать сессии? И возможно ли отследить момент и источник создания большой нагрузки на MySQL?
Сервер используется крайне мощный и это не узкое место. Может быть специфичные настройки MySQL?