为什么Python http请求创建时间等待连接?
我有一个简单的代码,它连接一个外部服务器。我把这个函数称为每分钟100秒。过了一段时间,我发现系统缺少足够的缓冲区异常。当我使用TCPView查看连接时,它显示了数百个以TIME\u WAIT状态连接到外部服务器的连接为什么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
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