Ошибка Python с сообщением запроса: ‘Соединение прервано, время ожидания (‘Время ожидания операции записи истекло’)

#python #python-3.x #python-requests

#python #python-3.x #python-запросы

Вопрос:

Я использую requests post для отправки некоторых данных, теперь я установил значение тайм-аута requests.post примерно на 60. другие подобные вопросы, связанные с конкретными приложениями, поэтому я хотел задать его как общую ошибку python.

это ошибка, которую я получаю:

 failed to connect  ('Connection aborted.', timeout('The write operation timed out'))
  

Я предполагаю, что это связано с тем, что по какой-то причине мой поток не смог отправить все данные вовремя, но я не уверен, поэтому просто хотел проверить. итак :

  1. происходит ли эта ошибка из-за того, что поток не смог отправить все данные за время ожидания?

  2. если да, могу ли я в любом случае установить время ожидания таким образом, чтобы оно начиналось только после отправки всех данных? я не хочу вечно ждать ответа сервера, но, очевидно, я хочу, чтобы таймер запускался, когда я отправляю все данные, а не в начале вызова функции. (и данные, которые я отправляю, различаются по размеру)

Ответ №1:

Если вы используете библиотеку python-request, вы можете указать параметр ‘timeout’ в качестве кортежа. Первый элемент — это «тайм-аут соединения», а второй — «тайм-аут чтения».

 requests.get('http://google.com', timeout=(10,200) # give it 10 seconds to connect to the server, and timeout if server does not send any data back for 200  seconds
  

в запросах используется urrlib3.util.Тайм-аут под капотом.
Согласно документам urllib3, установка времени ожидания чтения на None будет вечно ждать ответа сервера. Но я согласен, что ждать вечно — плохая идея.

Сколько данных вы отправляете в своем запросе? Я прочитал часть кода python-requests и не смог найти простой способ определить, когда запрос будет отправлен.

В качестве доказательства концепции я написал этот код на основе запросов (микрозапросов)

Это позволяет передавать функцию обратного вызова в requests.get() . Этот обратный вызов будет запущен после отправки всех данных запроса, но до того, как какие-либо данные будут получены сервером.

 import time

def sent_callback():
    print('The request has finished sending at', time.time())

resp = get('http://google.com', send_callback=sent_callback)
print('response received at', time.time())

print('resp.text=', resp.text)
  

Ответ №2:

Это может быть из-за проблемы с сетью, если проект будет перенесен на рабочий сервер с высокой скоростью Интернета, это должно решить эту проблему (я все еще проверяю свой проект).

Но для разработки вы можете попробовать это:

 # ('Connection aborted.', TimeoutError('The write operation timed out')): Increase chunksize
storage.blob._DEFAULT_CHUNKSIZE = 5 * 1024 * 1024
storage.blob._MAX_MULTIPART_SIZE = 5 * 1024 * 1024