Flask+Gevent PyWSGI+MySQL连接器:从池中获取连接时,有时会挂起



我正在开发一个使用Gevent PyWSGI和MySQL连接器作为DB驱动程序的Flask服务器。在monkey_patch使其同时为多个请求提供服务后,我发现有时我的服务器会挂起2个或多个并发请求,我必须重新启动服务器才能使其工作。详细信息:

  • 我设置了MySQL连接池(Pool_size=10(,并在应用程序上共享这个池实例
class PoolManager:
def __init__(self, *args, **kwargs):
self.args = args
self.kwargs = kwargs
self._init()
def _init(self):
self._pool = MySQLConnectionPool(*self.args, **self.kwargs)
def get_connection(self):
#logging greenlet id
print("Start get connection from pool....")
print("GID {}".format(id(gevent.getcurrent()))) 
new_cnx = self._pool.get_connection()
print(" -------CONN_ID: {}".format(new_cnx.__getattr__("connection_id")))
return new_cnx
  • 在运行时,一开始,一切似乎都很好,我看到池初始化了10到MySQL的连接,它运行得很好。每一个来的请求都是同时发出的
  • 过了一段时间,我又提出了两个请求。。stdout正好卡在上面的日志行:
Start get connection from pool....
GID 123xxxxx
Start get connection from pool....
GID 321xxxxx

然后什么也没发生。MySQL连接(通过show processlist(正在休眠,我的服务器挂起了。所以,我的问题是:

  • 我这里有比赛条件吗?问题在哪里?GeventPywsgi还是Mysql连接器
  • 这里哪种方法是正确的?MysqlConnectionPool不能在线程上重用,我应该为每个greenlet初始化每个连接吗

您可能需要一个用于gevent的特定mysql模块。UltraMysql位于此处:https://github.com/esnme/ultramysql

你应该看看这个例子。这在我所有的生产环境中都很有效。

Python Postgres psycopg2线程连接池已耗尽

最新更新