#python #python_3x #flask
Иногда моё Flask приложение зависает на следующей строке:
with shelve.open('user_db') as db:
(это происходит случайно)
Весь код приложения привести не могу (очень большой), но в общем это выглядит так:
@app.route('/', methods=['POST'])
def mpage():
Обработка запроса
Запуск следующего метода (set_timer) в потоке
Возвращение кода 200
def set_timer():
Запускается таймер, запускается отдельный процесс (см следующий метод) и проверяется
время выполнения этого процесса
def seps():
Тут почти в самом начале лежит проблемная строка
Приложение зависает именно на этой строке, я это выяснил путём отладочных сообщений.
Кто-нибудь может подсказать, в чём проблема?
UPD: заменил shelve на sqlite3. Открываю ее в глобальную переменную так:
conn = sqlite3.connect('user_db.db', check_same_thread=False)
Зависает здесь:
db = conn.cursor()
user_mode = db.execute('SELECT id, mode FROM users WHERE id={}'.format(user_id)).fetchall()
Не могу понять в чём проблема теперь
upd2:
Полностью перешёл на flask_sqlalchemy. Ошибка не пропала. Код:
Модель базы:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///./user.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
mode = db.Column(db.Integer, primary_key=False)
Как пользуюсь:
report += 'Открытие БД\n'
t_user = User.query.get(user_id)
if not t_user:
user = User(id=user_id, mode=0)
db.session.add(user)
db.session.commit()
t_user = User.query.get(user_id)
user_mode = t_user.mode
И где-то в этих строках зависает. Что делать - не знаю
Ответы
Ответ 1
Просто обрывается коннект к базе. Добавьте такие строки в ваш конфиг и будет счастье: app.config['SQLALCHEMY_POOL_RECYCLE'] = 299 app.config['SQLALCHEMY_POOL_TIMEOUT'] = 20Ответ 2
Возможно мой совет будет полезен - попробуйте Postgresql Вот пример кода: # -*- coding: utf-8 -*- from sqlalchemy import Column, Integer, String, create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker, scoped_session from contextlib import contextmanager Base = declarative_base() engine = create_engine('postgresql://user:pass@localhost:5432/db_name', pool_size=50, max_overflow=0, echo=True) @contextmanager def session(): connection = engine.connect() db_session = scoped_session(sessionmaker(autocommit=False, autoflush=True, bind=engine)) try: yield db_session except Exception as e: print(e) finally: db_session.remove() connection.close() class User(Base): __tablename__ = 'sign' id = Column(Integer, primary_key=True) name = Column(String(50)) def __init__(self, name): self.name = name def new_user(name): with session() as s: user = User(name) s.add(user) s.commit() return s.id
Комментариев нет:
Отправить комментарий