我正在使用urllib2
代理发送数千个请求。我在执行时收到了许多以下错误:
urlopen error [Errno 99] Cannot assign requested address
我在这里读到这可能是由于套接字已经被绑定。是这样吗?对于如何解决这个问题,有任何的建议吗?
我正在使用urllib2
代理发送数千个请求。我在执行时收到了许多以下错误:
urlopen error [Errno 99] Cannot assign requested address
我在这里读到这可能是由于套接字已经被绑定。是这样吗?对于如何解决这个问题,有任何的建议吗?
这是我之前准备的类似问题的答案.... 更早... 重用套接字时出现 Socket in use 错误
错误是不同的,但根本问题可能是相同的:您正在消耗所有可用端口并试图在 TIME_WAIT 状态结束之前重用它们。
[编辑:回应评论]
如果它在您的应用程序的能力/规格范围内,一个明显的策略是控制连接速率以避免这种情况。
或者,您可以使用该httplib
模块。httplib.HTTPConnection()
让您指定一个source_address
元组,您可以使用它指定建立连接的端口,例如,这将从 localhost:9999 连接到 localhost:1234:
import httplib
conn = httplib.HTTPConnection('localhost:1234', source_address=('localhost',9999))
conn.request('GET', '/index.html')
然后是管理源端口分配的问题,如我之前的回答中所述。如果您使用的是 Windows,则可以使用此方法绕过端口 1024-5000 的默认范围。
(当然)你可以建立多少个连接是有上限的,什么样的应用程序需要快速连续建立数千个连接是值得怀疑的。
正如mhawke建议的那样,这个问题TIME_WAIT
似乎最有可能。针对您的情况的系统范围修复可以是调整内核参数,以便更频繁地清理此类连接。两种选择:
$ sysctl net.ipv4.tcp_tw_recycle=1
这将让内核重用处于TIME_WAIT
状态的连接。这可能会导致 NAT 设置出现问题。另一个是:
$ sysctl net.ipv4.tcp_max_orphans=8192
$ sysctl net.ipv4.tcp_orphan_retries=1
这告诉内核最多保持8192
不附加到任何用户进程的连接,并且在终止 TCP 连接之前只重试一次。
请注意,这些不是永久性更改。添加设置以/etc/sysctl.conf
使其永久化。
http://code.google.com/p/lusca-cache/issues/detail?id=89#c4
http://tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.kernel.obscure.html
我有一个类似的问题,但是使用 python 的请求库使用 POST 命令!更糟糕的是,我在每个执行程序上使用多处理来发布到服务器。因此,在几秒钟内创建了数千个连接,每个连接需要几秒钟才能从 TIME_WAIT 更改状态并为下一组连接释放端口。
在互联网上所有可用的解决方案中,通过使用 request.Session() 等来禁用keep-alive,我发现这个答案是有效的,它使用 '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
只需尝试使用请求库即可。