Python 3.6.5:即使指定了chunk_length,流式传输的请求也被卡在iter_content中

时间:2018-10-10 00:58:31

标签: python-requests python-3.6 urllib3

我一直在尝试使用python 3.6.5中的v2.19.1请求从远程URL下载〜2GB文件。但是,我一直反复面对这个问题,在尝试下载数据时,代码似乎永远陷入for循环中。

我的代码段:

        with requests.get(self.model_url, stream=True, headers=headers) as response:

            if response.status_code not in [200, 201]:
                raise Exception(
                    'Error downloading model({}). Got response code {} with content {}'.format(
                        self.model_id,
                        response.status_code,
                        response.content
                    )
                )
            with open(self.download_path, 'wb') as f:
                for chunk in response.iter_content(chunk_size=1024):
                    if chunk:
                        f.write(chunk)

每次尝试运行此代码时,下载似乎都在不同时间停止,很少完成。 我尝试过使用不同的块大小,但是仍然会看到此问题。

一些其他详细信息:

    python -m requests.help
{
  "chardet": {
    "version": "3.0.4"
  },
  "cryptography": {
    "version": "2.3.1"
  },
  "idna": {
    "version": "2.7"
  },
  "implementation": {
    "name": "CPython",
    "version": "3.6.5"
  },
  "platform": {
    "release": "3.10.0-693.11.1.el7.x86_64",
    "system": "Linux"
  },
  "pyOpenSSL": {
    "openssl_version": "1010009f",
    "version": "18.0.0"
  },
  "requests": {
    "version": "2.19.1"
  },
  "system_ssl": {
    "version": "100020bf"
  },
  "urllib3": {
    "version": "1.23"
  },
  "using_pyopenssl": true
}

还有其他人遇到过类似的问题吗?如果是这样,您如何解决?

1 个答案:

答案 0 :(得分:0)

似乎在下载过程中网络中断,流挂断,连接中断。但是,由于未指定超时,因此代码似乎期望更多数据包通过死连接到达。我发现处理此问题的最佳方法是设置合理的超时时间。在最后收到的包之后达到超时后,代码将退出for循环,并带有可以处理的异常。