相关疑难解决方法(0)

SQLAlchemy在多线程应用程序中正确处理会话

我无法理解如何有效地正确打开和关闭数据库会话,正如我所理解的sqlalchemy文档,如果我使用scoped_session构造我的Session对象,然后使用返回的Session对象来创建会话,它的线程安全,所以基本上每个线程会得到它自己的会话,并且不会有问题.现在下面的例子工作,我把它放在一个无限循环中,看它是否正确关闭会话,如果我正确监视它(在mysql中通过执行"SHOW PROCESSLIST;"),连接只是继续增长,它不会关闭它们,即使我使用了session.close(),甚至在每次运行结束时删除了scoped_session对象.我究竟做错了什么?我在更大的应用程序中的目标是使用所需的最少数量的数据库连接,因为我当前的工作实现在需要它的每个方法中创建一个新会话,并在返回之前关闭它,这似乎效率低下.

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, scoped_session
from threading import Thread
from Queue import Queue, Empty as QueueEmpty
from models import MyModel


DATABASE_CONNECTION_INFO = 'mysql://username:password@localhost:3306/dbname'


class MTWorker(object):

    def __init__(self, worker_count=5):
        self.task_queue = Queue()
        self.worker_count = worker_count
        self.db_engine = create_engine(DATABASE_CONNECTION_INFO, echo=False)
        self.DBSession = scoped_session(
            sessionmaker(
                autoflush=True,
                autocommit=False,
                bind=self.db_engine
            )
        )

    def _worker(self):
        db_session = self.DBSession()
        while True:
            try:
                task_id = self.task_queue.get(False)
                try:
                    item = db_session.query(MyModel).filter(MyModel.id == task_id).one()
                    # do something with item
                except Exception as exc:
                    # …
Run Code Online (Sandbox Code Playgroud)

python session multithreading sqlalchemy

21
推荐指数
1
解决办法
2万
查看次数

标签 统计

multithreading ×1

python ×1

session ×1

sqlalchemy ×1