Python uwsgi下的烧瓶应用程序-can';看不到来自其他工作者的memcached条目

Python uwsgi下的烧瓶应用程序-can';看不到来自其他工作者的memcached条目,python,nginx,flask,memcached,uwsgi,Python,Nginx,Flask,Memcached,Uwsgi,所以我启动了20个uswgi进程,我使用Nginx来平衡它们 我注意到的是,当一个worker被命中时,它会在没有看到它在memcached中需要的结果后加载memcached。此后,worker将在memcached中找到它们。但是,其他工作人员在自己加载memcached结果之前,仍然看不到这些结果 知道会发生什么吗?以下是相关代码: import memcache import msgpack from flask import Flask app = Flask(__name__, s

所以我启动了20个uswgi进程,我使用Nginx来平衡它们

我注意到的是,当一个worker被命中时,它会在没有看到它在memcached中需要的结果后加载memcached。此后,worker将在memcached中找到它们。但是,其他工作人员在自己加载memcached结果之前,仍然看不到这些结果

知道会发生什么吗?以下是相关代码:

import memcache
import msgpack
from flask import Flask

app = Flask(__name__, static_url_path = "")
app.config['PROPAGATE_EXCEPTIONS'] = True

class MemCachedWrapper(object):
    """Simple wrapper around memcached to handle translating keys"""
    def make_key(self, key):
        #is this crazy??  memcached only wants strings and won't accept spaces
        return str(key).replace(' ','')
    def __init__(self, servers, debug=0, server_max_value_length=1024*1024*3,
        flush_on_start=False):
        #Set up memcached
        #see README.md for instructions on setting server_max_value_length on memcached (-I option)
        self.cache = memcache.Client(servers, debug=debug,
            server_max_value_length=server_max_value_length)
        if flush_on_start:
            self.cache.flush_all()
    def get(self, key):
        return self.cache.get(self.make_key(key))
    def get_multi(self, keys):
        m = self.make_key
        return self.cache.get_multi([m(k) for k in keys])
    def set(self, key, value):
        return self.cache.set(self.make_key(key), value)
    def delete(self, key):
        return self.cache.delete(self.make_key(key))

cache =MemCachedWrapper([MEMCACHE_URL], debug=0,
        server_max_value_length=MEMCACHE_MAX_VALUE_LENGTH)

def _get_range(key_beg, key_end):
    keys = get_keys(key_beg, key_end)
    def stream_results():
        mc_results = None        
        for scality_key in keys:
            if not mc_results:
                mc_results = cache.get_multi([k[0].encode('utf-8') for k in keys])
            scality_key = scality_key.encode('utf-8')
            obj = mc_results.get(scality_key)
            if obj:
                yield dvid_key, obj
            else:
                print "key miss"
                response = session.get(SCALITY_URL % scality_key)
                cache.set(scality_key, response.content)
                yield dvid_key, response.content
    return stream_results()

@app.route('/api/keyvalue_range/<key_beg>/<key_end>/', methods=['GET'])
def get_range(key_beg, key_end):
    results = _get_range(key_beg, key_end)
    packed = msgpack.packb(list(results), use_bin_type=True)
    return Response(packed, mimetype='application/x-msgpack')


if __name__ == '__main__':
    app.run(host=host, port=PORT, debug=True)
导入memcache
导入msgpack
从烧瓶进口烧瓶
app=Flask(\uuuuu name\uuuuuu,static\u url\u path=”“)
app.config['PROPAGATE_EXCEPTIONS']=True
类memcachedRapper(对象):
“”“围绕memcached的简单包装器,用于处理转换键”“”
def make_键(自,键):
#这疯了吗??memcached只需要字符串,不接受空格
返回str(键)。替换(“”,“”)
def uuu init uuuu(self,server,debug=0,server_max_value_length=1024*1024*3,
启动时刷新(错误):
#设置memcached
#有关在memcached(-I选项)上设置服务器最大值长度的说明,请参见README.md
self.cache=memcache.Client(服务器,调试=debug,
服务器\u最大值\u长度=服务器\u最大值\u长度)
如果在启动时刷新\u:
self.cache.flush_all()
def get(自身,密钥):
返回self.cache.get(self.make_key(key))
def get_multi(自身、钥匙):
m=自制钥匙
返回self.cache.get_multi([m(k)表示k in键])
def设置(自身、键、值):
返回self.cache.set(self.make_key(key),value)
def delete(自我,密钥):
返回self.cache.delete(self.make_key(key))
cache=MemCachedWrapper([MEMCACHE_URL],debug=0,
服务器\u最大值\u长度=内存缓存\u最大值\u长度)
定义获取范围(键beg,键end):
keys=获取keys(keys\U beg,keys\U end)
def stream_results():
mc_结果=无
对于scality_键入键:
如果不是mc_结果:
mc_results=cache.get_multi([k[0]。为k in键编码('utf-8'))
scality\u key=scality\u key.encode('utf-8')
obj=mc_results.get(缩放键)
如果obj:
屈服dvid_键,obj
其他:
打印“钥匙丢失”
response=session.get(SCALITY\u URL%SCALITY\u键)
cache.set(scality\u键,response.content)
生成dvid_键,response.content
返回流_结果()
@app.route('/api/keyvalue_range//',methods=['GET'])
def get_范围(键beg,键end):
结果=\u获取\u范围(键\u beg,键\u end)
packed=msgpack.packb(列表(结果),使用\u bin\u type=True)
返回响应(打包,mimetype='application/x-msgpack')
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
运行(主机=主机,端口=端口,调试=真)

这不是一个很好的答案,但我最终使用pylibmc作为我的memcached客户端库,它似乎已经解决了这个问题。不知道发生了什么事

对于上述代码的更改,基本上只有以下几行:

import pylibmc as memcache
...
self.cache = memcache.Client(servers, binary=True,
   behaviors={"tcp_nodelay": True, "ketama": True, "no_block": True})

这不是一个很好的答案,但我最终使用pylibmc作为我的memcached客户端库,它似乎已经解决了这个问题。不知道发生了什么事

对于上述代码的更改,基本上只有以下几行:

import pylibmc as memcache
...
self.cache = memcache.Client(servers, binary=True,
   behaviors={"tcp_nodelay": True, "ketama": True, "no_block": True})