重复的POST请求导致错误“socket.error:(99,'无法分配请求的地址')”

2024-06-28 19:10:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我的盒子里部署了一个web服务。我想用不同的输入检查这个服务的结果。下面是我使用的代码:

import sys
import httplib
import urllib

apUrl = "someUrl:somePort"

fileName = sys.argv[1]
conn = httplib.HTTPConnection(apUrl)

titlesFile = open(fileName, 'r')

try:
    for title in titlesFile:

        title = title.strip()
        params = urllib.urlencode({'search': 'abcd', 'text': title})
        conn.request("POST", "/somePath/", params)
        response = conn.getresponse()
        data = response.read().strip()
        print data+"\t"+title

        conn.close()

finally:
    titlesFile.close()

此代码在打印相同数量的行(28233)后出错。错误消息:

Traceback (most recent call last):
  File "testService.py", line 19, in ?
    conn.request("POST", "/somePath/", params)
  File "/usr/lib/python2.4/httplib.py", line 810, in request
    self._send_request(method, url, body, headers)
  File "/usr/lib/python2.4/httplib.py", line 833, in _send_request
    self.endheaders()
  File "/usr/lib/python2.4/httplib.py", line 804, in endheaders
    self._send_output()
  File "/usr/lib/python2.4/httplib.py", line 685, in _send_output
    self.send(msg)
  File "/usr/lib/python2.4/httplib.py", line 652, in send
    self.connect()
  File "/usr/lib/python2.4/httplib.py", line 636, in connect
    raise socket.error, msg
socket.error: (99, 'Cannot assign requested address')

我正在使用Python2.4.3。我也在做conn.close()。但为什么会出现这种错误呢?


Tags: inpyimportselfsendtitlerequestlib
3条回答

BIGYaN正确地识别了问题,您可以在异常发生后立即调用“netstat-tn”来验证这一点。你会看到很多与“时间等待”状态的联系。

等待端口号再次可用的另一种方法是对所有请求使用一个连接。在每次调用conn.request()之后,都不需要调用conn.close()。在完成请求之前,您只需保持连接打开即可。

在Spark中使用python的请求库执行多个POST语句时,我也遇到了类似的问题。更糟糕的是,我在每个执行器上使用了多处理来发送到服务器。因此,数千个连接在几秒钟内创建,每个连接花费几秒钟的时间来更改状态,以便等待并释放端口以进行下一组连接。

在internet上所有可用的解决方案中,谈到禁用keep alive,使用with request.Session()等,我发现this答案正在工作,它使用'Connection':'close'配置作为头参数。但是,您可能需要将标题内容放在post命令之外的单独行中。

headers = {
        'Connection': 'close'
}
with requests.Session() as session:
response = session.post('https://xx.xxx.xxx.x/xxxxxx/x', headers=headers, files=files, verify=False)
results = response.json()
print results

This是我使用上述解决方案解决类似问题的答案。

这不是python的问题。

在linux内核2.4中,短暂的端口范围是从32768到61000。所以可用端口数=61000-32768+1=28233。据我所知,由于所讨论的web服务非常快(实际上是<;5ms),因此所有端口都会用完。程序必须等待一两分钟才能关闭端口。

我所做的是计算conn.close()的数目。当号码是28000时,等待90秒并重置计数器。

相关问题 更多 >