Phi*_*uer 3 caching django-1.3 gunicorn
我对django的1.3版本有一些奇怪的缓存问题.我可能有错误的配置,但不知道是什么.
一个很好的例子是django-avatar,它使用缓存并且许多人使用它.即使我没有定义缓存后端,avatar似乎也会被缓存,这本身就可以,但它会在最后缓存的值之间来回切换.示例:我上传了一个新的头像,现在大约50%的请求会显示新的头像,50%是旧的头像.如果我删除旧的,我仍然会在50%的时间在网站上获取它.修复它的唯一方法是通过将其设置为一秒来禁用头像的缓存.
首先我认为这是因为我使用了django.core.cache.backends.locmem.LocMemCache,这是我以前从未使用过的,但它甚至在我根本不配置缓存后端时也会发生.
我发现了一个类似的错误: Django缓存错误..即使禁用了缓存
但我的页面渲染得很好,它的模板标签(现在)导致我的设置出现问题.
我使用django 1.3,postgres,nginx,gunicorn 0.12.0,greenlet == 0.3.1,eventlet == 0.9.16
我只是做了一些测试,并意识到只有当我使用配置文件启动gunicorn时才会发生这种情况.如果我用./manage.py启动它run_gunicorn一切都很好.运行"gunicorn_django -c deploy/gunicorn.conf.py"会导致问题.
我能想到的唯一解释是每个工作者都有自己的缓存(我想知道为什么,因为我没有定义缓存).
更新:运行./manage.py run_gunicorn -w 4也会导致同样的问题.因此,我几乎可以肯定,多个工人正在引发问题,每个工人都单独缓存这些值.
我的配置:
import os
import socket
import sys
PORT = 8000
PROC_NAME = 'myapp_gunicorn'
LOGFILE_NAME = 'gunicorn.log'
TIMEOUT = 3600
IP = '127.0.0.1'
DEPLOYMENT_ROOT = os.path.dirname(os.path.abspath(__file__))
SITE_ROOT = os.path.abspath(os.path.sep.join([DEPLOYMENT_ROOT, '..']))
CPU_CORES = os.sysconf("SC_NPROCESSORS_ONLN")
sys.path.insert(0, os.path.join(SITE_ROOT, "apps"))
bind = '%s:%s' % (IP, PORT)
logfile = os.path.sep.join([DEPLOYMENT_ROOT, 'logs', LOGFILE_NAME])
proc_name = PROC_NAME
timeout = TIMEOUT
worker_class = 'eventlet'
workers = 2 * CPU_CORES + 1
Run Code Online (Sandbox Code Playgroud)
我也尝试过它而不使用'eventlet',但是得到了同样的错误.
谢谢你的帮助.
它很可能默认为内存缓存,这意味着每个工作者在其自己的内存空间中拥有自己的缓存版本.如果您点击线程1,则获得一个不同的缓存,然后是线程3.Nginx正在通过循环分配在每个线程之间传播负载,因此您将更改每个命中的线程.这解释了你古怪的结果.
当您执行manage.py run_gunicorn时,它很可能运行单线程,因此只有一个缓存,这就是您看不到相同结果的原因.
使用memcached或类似的东西是要走的路.
| 归档时间: |
|
| 查看次数: |
2521 次 |
| 最近记录: |