SQLAlchemy 与 gevent 和 mysql

Edi*_*Edi 5 mysql sqlalchemy gevent gunicorn

我找不到关于这个问题的任何“最佳实践”。

在并发 gevent 环境中使用 SQLAlchemy 的最佳方法是什么?

我使用 Gunicorn (带有 -k gevent 标志)运行 Flask 应用程序。这是初始化数据库引擎一次的代码:

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))
Run Code Online (Sandbox Code Playgroud)

这是每个请求的代码:

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")
Run Code Online (Sandbox Code Playgroud)

即使运行数十个并发请求,打印的日志也始终显示“正在进入、正在退出、正在进入、正在退出...”。永远不要“进入、进入、退出、退出”。意味着每个请求的 gevent 线程在 I/O 上被阻塞,等待查询从数据库返回,但不会切换到其他等待的 gthread。

难道我做错了什么?