requests.exceptions.ConnectionError: ('Connection aborted.', error(99, 'Cannot assign requested address'))
当使用python请求库运行多个进程并将post
函数调用到非常快速返回的API(< 10ms)时,我收到此错误。
调低运行的进程数会产生延迟效果,但只有拨入1进程才能解决问题。这不是一个解决方案,但确实表明有限的资源是罪魁祸首。
答案 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