在gevent的上下文中分享sqlalchemy会话和引擎的正确方法

时间:2014-09-08 15:28:17

标签: python-3.x sqlalchemy gevent

我的代码首先尝试创建引擎:

def createEngine(connectionstring):
    engine = create_engine(connectionstring, 
        #pool_size = DEFAULT_POOL_SIZE, 
        #max_overflow = DEFAULT_MAX_OVERFLOW, 
        echo = False)
    return engine

然后从引擎获取会话:

@contextmanager
def getOrmSession(engine):
    try:
        Session.configure(bind=engine)
        session = Session()
        yield session
    finally:
        pass

客户端代码如下:

def composeItems(keyword, itemList):
    with getOrmSession(engine) as session:    
        for i in itemList:
            item = QueryItem(query=keyword, 
                        ......
                        active = 0)
            session.add(item)
        session.commit() 

然后当我在gevent spawn中调用composeItems时。显然,mysql死锁。发生了什么事?上述用法有什么问题?

1 个答案:

答案 0 :(得分:1)

自己找答案。

我需要在导入gevent时修补线程。所以scoped_session将能够使用greenlet的本地线程。改变补丁,现在一切正常。