![](/img/trans.png)
[英]what does “not threadsafe” mean? Using SimpleCache (python dictionary Cache) in Flask app
[英]What can go wrong if I use SimpleCache in my Flask app
我們使用以下設置:NGINX + Gunicorn + Flask。 我們需要添加一點緩存,每個Flask工作者不超過5Mb。 SimpleCache似乎是最簡單的解決方案 - 它在Python進程本身內部使用內存。
不幸的是,文檔說明了以下內容:
“用於單個進程環境的簡單內存緩存。此類主要用於開發服務器,並且不是100%線程安全的。”
但是,在我們的設置中,我沒有看到線程安全在哪里都很重要。 我認為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的緩存可以解決它。 我自己在嘗試。
對於使用gunicorn的用例,沒有多線程問題,因為每個服務在其自己的進程中單線程運行。 但潛在的問題是“臟”讀取數據。
考慮以下情況:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.