请求,无法分配请求的地址,出港口?

时间:2015-06-19 17:21:41

标签: python python-requests

requests.exceptions.ConnectionError: ('Connection aborted.', error(99, 'Cannot assign requested address'))

当使用python请求库运行多个进程并将post函数调用到非常快速返回的API(< 10ms)时,我收到此错误。

调低运行的进程数会产生延迟效果,但只有拨入1进程才能解决问题。这不是一个解决方案,但确实表明有限的资源是罪魁祸首。

2 个答案:

答案 0 :(得分:13)

我解决问题的方法是使用requests.Session类,我会在给定进程中为每个调用重用相同的连接/会话。

受挫的例子:

import requests
for line in file:
  requests.get('http://example.com/api?key={key}'.format(key=line['key']))

变为

import requests
with requests.Session() as session:
  for line in file:
    session.get('http://example.com/api?key={key}'.format(key=line['key']))

这些问题有一些相关的建议:

Repeated POST request is causing error "socket.error: (99, 'Cannot assign requested address')" Python urllib2: Cannot assign requested address

答案 1 :(得分:0)

我在Spark中使用python的请求库执行多个POST语句时也遇到了类似的问题。 更糟糕的是,我在每个执行程序上使用多处理来发布到服务器。 因此,在几秒钟内创建了数千个连接,每个连接都需要几秒钟才能从TIME_WAIT更改状态并释放下一组连接的端口。

在互联网上提供的禁用保持活动的所有可用解决方案中,与request.Session()等一起使用,我发现this答案正常。您可能需要将标题内容放在post命令之外的separte行中。

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