uWSGI 和 SQLAlchemy 一起使用的注意事项

最近在使用 Flask 中使用 SQLAlchemy  开发程序,一开始好好的,然后使用 uWSGI 部署到线上后,出现了各种 mysql 客户端的问题,如:

(_mysql_exceptions.ProgrammingError) (2014, "Commands out of sync; you can't run this command now")

NoSuchColumnError: "Could not locate column in row for column 'user_token.uid'"

等等。

 

直觉告诉我,一定是多线程引起的问题。但 flask 在使用 sqlalchemy 时,已经使用 scoped_session 包装了数据库的连接,使每个线程独立创建一个数据库连接,应该没有并发问题(参考:http://blog.csdn.net/yueguanghaidao/article/details/40016235)

 

于是就想是不是 uWSGI 本身的机制导致,然后看到此篇文章,才豁然开朗。http://mattharris.org/2015/10/fixing-sqlalchemy-mysql-errors-on-restart-of-uwsgi/

主要问题是说,uWSGI 启动 app 时,先在一个父进程中启动,然后 fork 出几个子线程。所以数据库连接也被 fork 出来了,于是出现了并发问题。在子线程中,出现问题后,会重新连接数据库,于是服务器又恢复健康状态了。

 

解决方法是,在 uWSGI 启动时增加 lazy-apps = true 属性,需要注意的是,这样会消耗较多的内存,因为子线程不是被 fork 出来的。

 

【百度了很久都没有结果,然后花钱买了vpn,google一下立马找到解决方案】

 

posted @ 2016-09-09 11:51  徐软件  阅读(2132)  评论(0编辑  收藏  举报