2015-07-07 5 views
1
import requests 
while True: 
    try: 
     posting = requests.post(url,json = data,headers,timeout = 3.05) 
    except requests.exceptions.ConnectionError as e: 
     continue 
    # If a read_timeout error occurs, start from the beginning of the loop 
    except requests.exceptions.ReadTimeout as e: 
     continue 

ссылки на дополнительный код: Multiple accidental POST requests in Python Этого код использует requests библиотеки для выполнения запросов POST на неопределенное время. Я заметил, что когда попытка не срабатывает несколько раз, а цикл while запускается всего несколько раз, то, когда я могу наконец отправить запрос на отправку, я обнаруживаю несколько записей с серверной стороны в эту же секунду. Я писал в txt-файл одновременно, и он показывал только одну запись. Каждая запись имеет 5 показаний. Это проблема с самой библиотекой? Есть ли способ исправить это ?! Независимо от того, какие условия, на которые я положил, все равно не работает: /! You can notice the reading at 12:11:13 has 6 parameters per second while at 12:14:30 (after the delay, it should be every 10 seconds) it is a few entries at the same second!!! 3 entries that make up 18 readings in one second, instead of 6 only!Проблемы с отправкой запросов POST с использованием библиотеки просит

+2

Какова ожидаемая функциональность? – Sait

+0

Код должен отправить запрос GET, а затем POST его и повторить. Иногда из-за проблем с сетью запросы POST несколько раз прерываются, поэтому я повторяю их дважды, если они отправляются, или еще GET и снова пытаюсь выполнить POST. Иногда при попытке POST, но сбой, после нескольких попыток, он, наконец, POST, но всплескивает набор записей вместо одной записи. Как показано на рисунке. На рисунке показана сторона сервера. –

+1

Я думаю, нам нужно больше кода. Кроме того, исправьте свои углубления - они важны для Python! Наконец, вы можете снова рассмотреть аргументы в свой метод '.post'? Они довольно перепутались. – justinpawela

ответ

2

Похоже, что сервер принимает ваши запросы и воздействует на них, но не реагирует вовремя (3s довольно низкий таймаут, операции загрузки шип/пейджинга может легко сделать пропуск сервера его, если он не использует специальные меры). Я хотел бы предложить, чтобы

  • запросы процесса асинхронно (например грибница потоки; Asynchronous Requests with Python requests обсуждаются способы сделать это с requests) и не используют тайм-аутов (TCP имеет свой собственный таймаут, пусть она не справится, а).
  • reuse the connection(s) (TCP имеет довольно много накладных расходов на установление/нарушение соединения) или вместо этого использует UDP.
  • включают некоторые «подсказки» (идентификаторы, временные метки и т. Д.), Чтобы сервер не добавлял повторяющиеся записи. (Я бы назвал это одному обходной путь, как реальная проблема, вы не убедившись, что, если ваш запрос был обработан.)

Со стороны сервера, вы можете:

  • Ответить КАК МОЖНО СКОРЕЕ. Не позволяйте ожидающим действия предотвратить ответ на другие запросы.
+1

Большое спасибо за ваш сложный ответ. Вчера я использовал ваш совет об удалении тайм-аута, и, на удивление, у меня все еще была такая же проблема, но в меньшем масштабе (всего две записи за раз). Однако похоже, что эта проблема возникает только тогда, когда в моих наблюдениях есть исключение readtimeout.Я все еще собираюсь использовать и тестировать асинхронные запросы в ближайшее время, но думал о том, чтобы сообщить вам и посмотреть, есть ли у вас какие-либо данные относительно этого обновления. –

+1

1) Исключив «тайм-аут», вы перестали вмешиваться в усилия по доставке TCP (таким образом, естественно, улучшая доставку). Ничто не застраховало бы вас от того, что сервер не отвечает в течение каких-либо временных рамок, вам нужно решить, сколько времени попробовать, прежде чем в конечном итоге отказаться. 1.1) Если у вас есть доступ к серверу, вы можете диагностировать проблему со своей стороны, чтобы узнать, что ее занимает так долго. 2) «Две записи за один раз» (а не одна) могут быть вызваны не использованием асинхронного ввода-вывода: если I/O занял достаточно много времени, ваша программа, возможно, пропустила время для следующей отправки и прямое нажатие к следующему. –

+0

Я изучил асинхронные запросы, и теперь я, что вы имеете в виду. Я выяснил, что проблема возникает, главным образом, когда есть ошибка таймаута чтения. В большинстве случаев он отправляет запрос POST, но на сервере не будет ответа, поэтому я отправлю его еще раз, а первый был отправлен. Это приводит к двум записям, когда сервер, наконец, отвечает, или больше, в зависимости от того, сколько раз я прошу повторить запрос в течение того же проблемного периода таймаута. Используя keep-alive для повторного использования, означает ли это, что мне нужно создать сеанс для GET и POST для поддержания того же соединения? –

Смежные вопросы