【问题标题】:requests, cannot assign requested address, out of ports?请求,无法分配请求的地址,超出端口?
【发布时间】:2020-04-25 07:41:37
【问题描述】:
requests.exceptions.ConnectionError: ('Connection aborted.', error(99, 'Cannot assign requested address'))

我在使用 python 请求库运行多个进程并将post 函数调用到返回非常快(

减少正在运行的进程数会产生延迟效果,但只减少到 1 个进程就可以解决问题。这不是一个解决方案,但确实表明有限的资源是罪魁祸首。

【问题讨论】:

  • 打开出站 TCP 连接会随机分配一个高范围内的随机端口号(IIRC,最大值约为 64k;范围从哪里开始,与为入站保留使用的端口相比,是可配置的)。因此,如果您同时打开了大量的出站 TCP 连接,无论是什么库/编程语言/等等。你正在使用,你很容易遇到这个问题。
  • 这个答案指出可用端口范围是 32768 到 61000。所以可用端口数 = 61000-32768+1 = 28233 stackoverflow.com/a/11208991/1942007 感谢您的评论!
  • 同样的问题

标签: python python-requests


【解决方案1】:

我解决问题的方法是使用 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

【讨论】:

    【解决方案2】:

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

    在互联网上所有可用的解决方案中,使用 request.Session() 等来禁用保持活动,我发现this 答案正在工作。不过,您可能需要将标题内容放在 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
      • 2021-11-03
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多