线程和SQLAlchemy会话

时间:2013-08-07 16:56:35

标签: python mysql sqlalchemy connection-pooling

我知道这个问题已被问过几次,但我仍然不确定scoped_session是否使用了线程。基本上,我有一个带有10个工作线程的应用程序。我有一个Engine,连接池大小为11.每个线程都有自己的会话,并且不需要在线程的会话中共享信息(如果可以的话,那会很好,但我创建了一个解决方法)。最后,我在主线程中使用SQLAlchemy Core来处理复杂的SQL语句,这就是我在连接池中有11个线程的原因。

我正在使用MySQL而我的pool_recycle设置为3600.我一直收到错误:

(OperationalError) (2013, 'Lost connection to MySQL server during query')

当我只有一个工作线程时,即使没有设置任何pool_recycle,也从未发生这种情况。我对MySQL和SQLAlchemy有一个非常基本的了解,所以我不确定我的问题是否源于我使用SQLAlchemy或MySQL(或者上述都没有)。

这是我的设置:

common = Common()
class Common(object):
    def __init__(self):
    ...
         self.engine = create_engine(
            '%(type)s://%(username)s:%(password)s@%(endpoint)s:%(port)s/%(name)s?charset=utf8' % {
              'type': config.get('db_type'),
              'username': 'foo',
              'password': 'bar',
              'endpoint': config.get('db_endpoint'),
              'port': str(config.get('db_port')),
              'name': config.get('db_name'),
            },
        encoding='utf-8',
        pool_size=config.get('num_workers') + 1,
        pool_recycle=3600,
    )
    self.session = sessionmaker(bind=self.engine)

每个工作人员都会调用self.session = common.session()并在整个过程中使用此会话。

1 个答案:

答案 0 :(得分:0)

根据文档,你应该为每个子进程使用不同的引擎实例,在你的情况下你有一个引擎用于所有子进程,因为子进程之间的连接池不能共享(据我所知)。

http://docs.sqlalchemy.org/en/rel_0_8/core/connections.html