极客公园

极客公园成立于2010年,是中国创新者的大本营。通过对前沿科技的观察报道,业界一流的线下活动,众筹孵化等全方位的创业服务 ...

↑我也要推荐

python-memcached 这个垃圾:关于兼容和内存泄露

发布时间:2011-06-15 02:41:35, 关注:+7340, 赞美:+8, 不爽:+121

本文标签: memcache python-memcached

原始出处: 惊帆之静默

作为广为流行的、独霸一方的一个组件,python-memcache是给python连接memcache用的(废话)。可是就这么个东西居然是如此的垃圾,每每让我惊叹。

1、跟同事合作开发系统,他用Java/PHP,我用Python,需要共同通信的部分用了4台memcache做分布。Java与PHP连接memcache的组件用得相同的分布算法,兼容很好,如果一个键存到一台机器上,就绝对不用再去另外一台上遍历。而Python的这个,用了作者自己写的一套山寨分布算法,与Java/PHP的不兼容。丫的要是Python在TIOBE上排第一名也就算了。Java和PHP都是牛x大发了的东西,你还敢搞不兼容。

2、一套系统,需要定期清除memcache,使另一个系统在发现找不到cache时来访问我的接口。每秒钟执行20次左右,遍历4台memcache上清除共8个键(我也没写兼容的分布算法,于是遍历)。正常运行状况下发现服务器启动时占用8MB内存,可是每10秒左右就增加 2MB的内存使用量。系统上线后两三个小时就把2GB内存占光了,于是死掉。丫的调试了我4天时间,还熬过两次到4:00,最后才发现是python-memcache里面的内存泄露。我已经不在乎具体哪个点在泄漏了。愤怒之下,自己用socket实现了memcache的通信协议,实现了清除指定键的功能。

见过山寨的东西(Pylons),没见过这么山寨的(python-memcache)。

附使用socket实现的memcache协议,清除key部分:

def clear_cache(md5v):
    '''使用socket方式清除memcache'''
    key1=KEY_CDNJAVA_MEMCACHE1%{’md5v’:md5v}
    key2=KEY_CDNJAVA_MEMCACHE2%{’md5v’:md5v}
    for mcs in setting.mcserverlist:
        hostport=mcs.split(’:',1)
        if len(hostport)==1:
            host=hostport[0]
            port=11211
        else:
        host,port=hostport
        port=int(port)
        try:
            s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            s.settimeout(1)
            s.connect((host,port))
            cmd=’delete %s\r\n’%key1
            s.send(cmd)
            s.recv(1024)
            cmd=’delete %s\r\n’%key2
            s.send(cmd)
            s.recv(1024)
            s.close()
        except socket.error,ex:
            print ‘[EX][clear_cache] %s’%str(ex)
    return

原文评论回复:

Qiangning Hong Says: 广告时间: 试试豆瓣的subdragon维护的 http://code.google.com/p/python-libmemcached/ 吧

shell Says: 不用那么麻烦,直接用flush_all就可以了。这个命令清除所有数据。

ZiDing Says: 哈哈哈,站在作者的角度看,兼容不是必需的,但是有memory leak,实在是过分了。不过代码都给你了,想怎么玩还不都是你自己的事啊~

# 原文为 08 年的老文,仅供参考。 原文代码格式缺失,以上根据推测进行了格式化。

如果你觉得本站对你有帮助,欢迎向本站赞助 :P

使用支付宝捐赠

Copyright© Python4cn(news, jobs) simple-is-better.com, 技术驱动:powered by web.py 空间主机:Webfaction

版权申明:文章转载已注明出处,如有疑问请来信咨询。本站为 python 语言推广公益网站,与 python 官方没有任何关系。

联系/投搞/留言: en.simple.is.better@gmail.com 向本站捐赠