关于这个问题,我找不到任何“最佳做法”。
在并发gevent环境中使用SQLAlchemy的最佳方法是什么?
我使用gunicorn(带-k gevent标志)运行一个烧瓶应用程序。 这是一次初始化数据库引擎的代码:
from gevent import monkey
monkey.patch_all()
orm_engine = create_engine('mysql+mysqldb://user:pass@127.0.0.1/mydb',
pool_size=10, strategy='threadlocal')
SessionFactory = scoped_session(sessionmaker(bind=orm_engine))
这是每个请求的代码:
log.info("Entering")
session = SessionFactory()
my_obj = session.query(MyObj).get(request['obj_id'])
my_obj.some_property += 1
session.add(my_obj)
session.commit()
session.close()
log.info("Exiting")
即使在运行数十个concurent请求时,打印的日志也始终显示“进入,退出,进入,退出......”。绝不“进入,进入,退出,退出”。意味着每个请求的gevent线程在I / O上被阻塞,等待查询从DB返回,但不会切换到其他等待的gthread。
我做错了吗?