为什么Python http请求创建时间等待连接?

为什么Python http请求创建时间等待连接?,python,python-requests,Python,Python Requests,我有一个简单的代码,它连接一个外部服务器。我把这个函数称为每分钟100秒。过了一段时间,我发现系统缺少足够的缓冲区异常。当我使用TCPView查看连接时,它显示了数百个以TIME\u WAIT状态连接到外部服务器的连接 为什么会这样 python请求模块不适合吗?如果我必须发送100个请求,那么我应该怎么做 def sendGetRequest(self, url, payload): success = True url = self.generateUr

我有一个简单的代码,它连接一个外部服务器。我把这个函数称为每分钟100秒。过了一段时间,我发现系统缺少足够的缓冲区异常。当我使用TCPView查看连接时,它显示了数百个以TIME\u WAIT状态连接到外部服务器的连接

  • 为什么会这样
  • python请求模块不适合吗?如果我必须发送100个请求,那么我应该怎么做

      def sendGetRequest(self, url, payload):
    
            success = True
            url = self.generateUrl(url)
            result = requests.get(url, params=urllib.parse.urlencode(payload))
            code = result.status_code
            text = result.text
    
            if code < 200 or code >= 300:
                success = False
    
            result.close()
            return success, code, text
    
    def sendGetRequest(自身、url、有效负载): 成功=正确 url=self.generateUrl(url) 结果=requests.get(url,params=urllib.parse.urlencode(有效负载)) 代码=结果状态\代码 text=result.text 如果代码<200或代码>=300: 成功=错误 结果关闭() 返回成功、代码、文本

  • 您正在关闭在客户端用
    请求打开的许多连接,而服务器希望这些请求被重新使用

    由于HTTP是一种TCP协议,是一种双向协议,因此关闭客户端的套接字意味着在另一端(服务器端)确认连接已正确关闭之前,套接字无法完全关闭。在与服务器交换确认信息之前(或在达到设置为最大段生存期2倍的超时之前),套接字将保持
    TIME\u WAIT
    状态。在HTTP中,关闭通常发生在服务器端,在响应完成之后;服务器将等待客户端确认关闭

    您会看到很多这样的情况,因为每个新连接都必须使用新的本地端口号。服务器看不到几乎相同的问题,因为它对传入的请求使用固定的端口号,并且单个端口号可以接受更多的连接,即使可能存在任意数量的未完成的
    TIME\u WAIT
    连接状态。另一方面,
    TIME\u WAIT
    中的大量本地传出端口意味着您最终将耗尽可用于连接的本地端口

    这不是Python或
    请求所独有的

    相反,您应该做的是最小化连接的数量并最小化关闭。现代HTTP服务器期望您对多个请求重用连接。您希望使用,以便它可以为您管理连接,然后不要自己关闭连接

    您还可以通过使用标准的
    请求
    功能大大简化您的功能<例如,code>params
    已经处理url编码,并且比较已经为您提供了一个布尔值,您可以直接分配给
    success

    session = requests.Session()
    
    def sendGetRequest(self, url, payload):
        result = session.get(self.generateUrl(url), params=payload)
        success = 200 <= result.status_code < 300
        return success, result.status_code, result.text
    

    下一步,您可能需要考虑使用(和,仍然使用会话)来实现所有这些检查请求。这样,您的代码就不必在每次请求-响应往返过程中都处于空闲状态,而是可以在这段时间内执行其他操作。我构建的应用程序一次可以处理1000个并发HTTP请求,而不费吹灰之力,同时在缓慢的网络I/O操作完成时执行大量有意义的操作。

    可能不是问题所在,但如果您发送了那么多请求,您可能会更喜欢a。您可能想查看其含义。这是一个TCP特性,不是Python特有的。早些时候,我尝试不使用close,但结果是一样的。但当我使用会话时,一切都解决了。如果我连续运行这个应用程序一段时间,比如几天,我是否应该关闭会话对象并创建一个新的会话对象?不,会话正在管理连接,让它去做它的工作。服务器将在需要时关闭已打开更长时间的连接,会话将打开一个新连接以替换这些连接。当不使用会话对象时,您会不断为每个请求创建新连接,它们会自动关闭,因为您停止使用隐式会话。
    def sendGetRequest(self, url, payload):
        result = session.get(self.generateUrl(url), params=payload)
        return result.ok, result.status_code, result.text