Ответ 1
Объекты сеанса не потоко-безопасны, но являются локальными. Из документов:
"Объект
Session
полностью разработан для использования в непараллельном режиме, что в терминах многопоточности означает" только в одном потоке за один раз ". что множественные вызовы во многих потоках фактически не получают дескриптор одного и того же сеанса. Мы называем это понятие локальным хранилищем потока. "
Если вы не хотите выполнять работу по управлению потоками и сеансами самостоятельно, в SQLAlchemy есть объект ScopedSession
, который позаботится об этом за вас:
Объект
ScopedSession
по умолчанию использует threading.local() в качестве хранилища, так что одинSession
поддерживается для всех, кто обращается к рееструScopedSession
, но только в рамках одного нить. Вызывающие, которые обращаются к реестру в другом потоке, получают экземпляр Session, который является локальным для этого другого потока.Используя эту технику,
ScopedSession
обеспечивает быстрый и относительно простой способ предоставления одного глобального объекта в приложении, которое безопасно вызывать из нескольких потоков.
См. примеры в контекстных/локальных сеансах для настройки собственных потоковобезопасных сеансов:
# set up a scoped_session
from sqlalchemy.orm import scoped_session
from sqlalchemy.orm import sessionmaker
session_factory = sessionmaker(bind=some_engine)
Session = scoped_session(session_factory)
# now all calls to Session() will create a thread-local session
some_session = Session()
# you can now use some_session to run multiple queries, etc.
# remember to close it when you're finished!
Session.remove()