标签:python caching python-2-7 flask gunicorn
我们正在使用以下设置:NGINX Gunicorn Flask.我们需要添加一点缓存,每个Flask工作者不超过5Mb. SimpleCache似乎是最简单的解决方案 – 它在Python进程本身内部使用内存.
不幸的是,文档说明了以下内容:
“Simple memory cache for single process environments. This class
exists mainly for the development server and is not 100% thread safe.”
但是,在我们的设置中,我没有看到线程安全在哪里都很重要.我认为Gunicorn让几个Flask工作者在运行,每个工人都有自己的小缓存.什么可能出错?
解决方法:
我目前正在处理一个场景,在用户登录应用程序后,我想将他的IP,用户名插入数据库.
现在,我只能做一次的方法是使用Cache将用户的ip和用户名存储在缓存中.
现在,每个gunicorn进程初始化自己的缓存时都会出现问题.如果为proc1的缓存添加用户名ip组合,如果proc2接收到同一用户的下一个请求,它将无法在其缓存中找到它,因此将其再次添加到其缓存和数据库中,这是不合适的.因此,在这种情况下,线程安全(进程安全)缓存很重要.
示例日志:
2015-07-07 22:42:31 - myapp.views:29 - DEBUG - not from cache user1100.100.100.100, <type 'unicode'> [14776]
2015-07-07 22:42:31 - myapp.views:30 - DEBUG - from cache : user1100.100.100.100, <type 'unicode'> [14776]
2015-07-07 22:42:40 - myapp.views:29 - DEBUG - not from cache user1100.100.100.100, <type 'unicode'> [14776]
2015-07-07 22:42:40 - myapp.views:30 - DEBUG - from cache : user1100.100.100.100, <type 'unicode'> [14776]
2015-07-07 22:42:41 - myapp.views:29 - DEBUG - not from cache user1100.100.100.100, <type 'unicode'> [14779]
2015-07-07 22:42:41 - myapp.views:30 - DEBUG - from cache : None, <type 'NoneType'> [14779]
2015-07-07 22:42:41 - myapp.views:32 - DEBUG - new username ip [14779]
2015-07-07 22:42:41 - myapp.views:38 - DEBUG - User : user1, ip : 100.100.100.100, noted at time : Tue Jul 7 22:42:41 2015, login_count : None [14779]
您可以看到gunicorn进程14776首先将其添加到其缓存中,并且下一个请求被14776选中,因此数据库条目仅发生一次,但之后,下一个请求被14779拾取,将其添加到其缓存中,因此db .
cache = SimpleCache(threshold=1000, default_timeout=3600)
使用基于memcache或redis的缓存可以解决它.我自己在尝试.
标签:python,caching,python-2-7,flask,gunicorn 来源: https://codeday.me/bug/20190702/1361148.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。