【问题标题】:Python urllib2: Cannot assign requested addressPython urllib2:无法分配请求的地址
【发布时间】:2012-08-12 11:51:06
【问题描述】:

我正在使用带有代理的urllib2 发送数千个请求。我在执行时收到了许多以下错误:

urlopen error [Errno 99] Cannot assign requested address

我读到here 可能是由于套接字已经被绑定。是这样吗?有关如何解决此问题的任何建议?

【问题讨论】:

标签: python proxy python-2.7 urllib2


【解决方案1】:

这是我早前准备的一个类似问题的答案……早得多…… Socket in use error when reusing sockets

错误不同,但根本问题可能相同:您正在消耗所有可用端口并试图在 TIME_WAIT 状态结束之前重用它们。

[编辑:回应 cmets]

如果它在您的应用程序的能力/规范范围内,一个明显的策略是控制连接速率以避免这种情况。

或者,您可以使用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 范围。

(当然)您能够建立的连接数量有一个上限,而且什么样的应用程序需要快速连续建立数千个连接是值得怀疑的。

【讨论】:

  • 谢谢,这解释了很多。正如你所说,错误是不一样的。我实际上并没有在我的应用程序中使用套接字库。我将 urllib2 和 gevent 用于许多异步连接。你知道我如何使用这些库而不是套接字库来实现这个解决方案吗?
【解决方案2】:

正如 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

【讨论】:

    【解决方案3】:

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

    在互联网上所有可用的解决方案中,通过使用 request.Session() 等来禁用 keep-alive,我发现 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
    

    请尝试使用请求库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-03
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多