2016-10-30 3 views
0

Я новичок в sqlalchemy, и мне кажется, что я до сих пор пропустил несколько фундаментальных концепций. Я хочу использовать sqlalchemy для обработки взаимодействия db в многопоточном веб-приложении.SQLAlchemy: как связать сеанс с привязкой к запросу

Так я начинаю с

import sqlalchemy 
from sqlalchemy     import create_engine 
from sqlalchemy.orm    import sessionmaker, scoped_session 

engine   = create_engine('mysql://mydb') 
session_factory = sessionmaker(autocommit = False, 
           autoflush = False, 
           bind  = engine) 
Session   = scoped_session(session_factory) 

Я использую MoinMoin вики, который обрабатывает запросы, поэтому у меня есть объект, содержащий macro.request запрос.

теперь у меня есть метод в каком-то классе, скажем

def do_sth(): 
    session = Session() 
    # use the session to get some data from the db 

Где и как я могу сказать Session объект, запрос, он связан с?

Multi-threaded use of SQLAlchemy Чтение, это говорит

Объект ScopedSession по умолчанию использует [threading.local()] в качестве хранилища, так что одна сессия сохраняется для всех, призывающих реестра ScopedSession, но только в рамках одного потока. Абоненты, которые обращаются к реестру в другом потоке, получают экземпляр сеанса, который является локальным для этого другого потока.

поэтому «Абоненты, которые обращаются к реестру в другом потоке, получают экземпляр сеанса, который является локальным для этого другого потока».

Как экземпляр сеанса локальный, если я никогда не говорил ему, к какому запросу он связан?

ответ

0

SQLAlchemy documentation говорит

Таким образом, наш вышеприведенный пример использования scoped_session, где тот же объект Session поддерживается через несколько вызовов, позволяет предположить, что какой-то процесс должен быть в таких местах, что mutltiple звонки через несколько потоков на самом деле не получить дескриптор одного сеанса. Мы называем это потоковое хранилище данных понятия, то есть используется специальный объект, который будет поддерживать отдельный объект в каждом потоке приложения. Python предоставляет это через конструкцию threading.local().

Так что даже если я не понял, как получить текущий поток pid из данной сессии threading модуля используется, чтобы связать сессию с нитью. В частности, можно проверить сеанс hash key

session.hash_key 

в примере в этом вопросе, чтобы проверить, что Session() обеспечивает ту же сессию в течение двух вызовов, если и только если оба были сделаны в том же потоке.

Таким образом, сеансы должным образом связаны с запросами, если каждый запрос обрабатывается собственным потоком.

Смежные вопросы