首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何关闭requests.Session()?

如何关闭requests.Session()?
EN

Stack Overflow用户
提问于 2018-03-13 18:02:51
回答 1查看 10.3K关注 0票数 6

我正在尝试关闭requests.Session(),但它无法关闭。

代码语言:javascript
复制
s = requests.Session()
s.verify = 'cert.pem'
res1 = s.get("https://<ip>:<port>/<route>")
s.close() #Not working
res2 = s.get("https://<ip>:<port>/<route>") # this is still working which means s.close() didn't work.

如何关闭会话?s.close()也没有抛出任何错误,这意味着它是一个有效的语法,但我不明白它到底在做什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-13 18:20:50

requests的源码中,Session.close只关闭所有底层的Adapter,进一步关闭一个Adapter就是清除底层的PoolManager,那么这个PoolManager内部已经建立的所有连接都会被关闭,但是如果没有可用的连接,PoolManager会重新创建一个连接。

关键代码:

代码语言:javascript
复制
# requests.Session
def close(self):
    """Closes all adapters and as such the session"""
    for v in self.adapters.values():
        v.close()

# requests.adapters.HTTPAdapter
def close(self):
    """Disposes of any internal state.

    Currently, this closes the PoolManager and any active ProxyManager,
    which closes any pooled connections.
    """
    self.poolmanager.clear()
    for proxy in self.proxy_manager.values():
        proxy.clear()

# urllib3.poolmanager.PoolManager
def connection_from_pool_key(self, pool_key, request_context=None):
    """
    Get a :class:`ConnectionPool` based on the provided pool key.

    ``pool_key`` should be a namedtuple that only contains immutable
    objects. At a minimum it must have the ``scheme``, ``host``, and
    ``port`` fields.
    """
    with self.pools.lock:
        # If the scheme, host, or port doesn't match existing open
        # connections, open a new ConnectionPool.
        pool = self.pools.get(pool_key)
        if pool:
            return pool

        # Make a fresh ConnectionPool of the desired type
        scheme = request_context['scheme']
        host = request_context['host']
        port = request_context['port']
        pool = self._new_pool(scheme, host, port, request_context=request_context)
        self.pools[pool_key] = pool

    return pool

因此,如果我很好地理解它的结构,当你关闭一个Session时,你几乎等同于创建一个新的Session并将它分配给旧的a。所以你仍然可以用它来发送请求。

或者如果我误解了什么,欢迎纠正我:D

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49253246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档