Python 3.6.5: запросы с потоковой передачей застряли в iter_content, даже если указана длина chunk_length - PullRequest
0 голосов
/ 10 октября 2018

Я пытался использовать запросы v2.19.1 в python 3.6.5 для загрузки файла размером ~ 2 ГБ с удаленного URL-адреса.Однако я неоднократно сталкивался с этой проблемой, когда код, кажется, навсегда застревал в цикле 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 голосов
/ 24 октября 2018

Похоже, что если во время загрузки происходит какое-либо прерывание сети, поток зависает, и соединение прерывается.Однако, поскольку время ожидания не указано, кажется, что код ожидает, что больше пакетов поступит через мертвое соединение.Лучший способ справиться с этим - установить разумное время ожидания.По истечении времени ожидания после последнего полученного пакета код выходит из цикла for с исключением, которое может быть обработано.

...