2016-10-30 28 views
0

我是sqlalchemy的新手,看起来我仍然错过了几个基本概念。我想使用sqlalchemy来处理多线程Web应用程序中的数据库交互。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,它说

默认情况下会[threading.local()]作为存储,从而使单个会话保持所有谁呼吁ScopedSession注册表,但ScopedSession对象只在单个线程的范围内。在另一个线程中调用注册表的调用者会获得一个对其他线程本地的Session实例。

so“在不同线程中调用注册表的调用者将获得一个本地于该其他线程的Session实例。”

如果我从来没有告诉它会将它连接到哪个请求,Session实例如何是本地的?

回答

0

SQLAlchemy documentation

所以我们scoped_session使用,其中相同的Session对象在多个呼叫保持,上述例子表明,一些过程需要就位,mutltiple跨多个线程调用实际上并没有得到同一个会话的句柄。我们称这个概念线程为本地存储,这意味着使用了一个特殊的对象,它将为每个应用程序线程维护一个独特的对象。 Python通过threading.local()构造提供了这个功能。

因此,尽管我还没有想出如何获得当前线程的pid从给定的会议上,threading模块用于会话链接到线程。具体而言,可以检查在关注的例子会话的hash key

session.hash_key 

来测试Session()两次调用提供了相同的会话当且仅当两人都在同一个线程制作。

因此,总之,只要每个请求都由其自己的线程处理,会话就会正确链接到请求。

相关问题