【问题标题】:ResourceWarning: python-memcached not closing socket?ResourceWarning:python-memcached 没有关闭套接字?
【发布时间】:2017-05-25 15:02:57
【问题描述】:

我正在使用 Python 3.6.1 运行一些单元测试并获得 ResourceWarning

ResourceWarning: unclosed <socket.socket fd=14, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 54897), raddr=('127.0.0.1', 11211)>

代码的端口和区域表明它是memcached,我使用的是python-memcached 1.5.8。相关代码在这里:

if use_caching:
    import memcache
    mc = memcache.Client(['127.0.0.1:11211'], debug=0)

    key = 'descendent-catalog-ids-{0}'.format(str(cat_id))

    catalog_ids = mc.get(key)
    if catalog_ids is None:
        catalog_ids = get_descendent_ids(hierarchy_session)
        mc.set(key, catalog_ids)
else:
    catalog_ids = get_descendent_ids(hierarchy_session)

我是否应该以某种方式手动关闭 memcached Client 实例?我在源代码或文档中找不到任何关于手动关闭套接字的参考,所以我认为库会自动处理这个问题......

我还没有找到任何类似的问题(urllib 只找到一个),并且 GitHub 中没有任何相关问题,所以我的假设是我遗漏了一些简单的问题。

【问题讨论】:

    标签: python sockets memcached python-memcached


    【解决方案1】:

    是的,pymemcached 客户端有一个 close 方法: https://pymemcache.readthedocs.io/en/latest/apidoc/pymemcache.client.base.html#pymemcache.client.base.Client.close

    或者您可以编写自己的经理:

    class Cache(object):
    """
    General caching wrapper for accessing shared objects across machines or processes
    """
    
    def __init__(self):
        self.client = None
        self._host = os.environ["MEMCACHED_HOST"]
        self._port = 11211
    
    def __enter__(self):
        self.client = base.Client((self._host, self._port))
        return self.client
    
    def __exit__(self, type, value, traceback):
        self.client.close()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-25
      • 2017-05-03
      • 2013-01-03
      • 2011-06-29
      • 1970-01-01
      • 2016-09-26
      • 1970-01-01
      • 2011-05-08
      相关资源
      最近更新 更多