2016-02-09 4 views
8

У меня есть программа Python, которая отправляет несколько (около 5-6) запросов на запросы параллельно, используя разные потоки для каждого опроса через пакет запросов. И я понял, что некоторые из моих потоков иногда просто замерзают. Когда это произойдет, сервер, на который я отправляю запрос, не получает запрос. Также я установил тайм-аут запроса, и он не работает.Запросы на Python иногда зависают

try: 
    print("This line prints") 
    response = requests.head(poll_request_url, timeout=180) 
    print("This line does not print when freeze occurs") 
except ReadTimeout: 
    print("Request exception.") 
except RequestException as e: 
    print("Request exception.") 
except Exception: 
    print("Unknown exception.") 
print("This line does not print either when freeze occurs.") 

Я делаю это на аппарате Raspberry Pi 2 с операционной системой Raspbian.

Я использовал эту же программу без проблем, когда использовал Python 2.7. Недавно я переключился на Python 3.5. Я тестировал, используя обе версии запросов с 2.8.1 и 2.9.1.

Эта проблема возникает не часто, но происходит 2-3 раза в день на разных потоках.

В чем может быть проблема? Как я могу отладить это?

Редактировать: Проблема решена путем обновления ядра Linux.

ответ

5

Согласно документации:

http://docs.python-requests.org/en/master/user/quickstart/#timeouts

Следует бросать Timeout исключение, когда тайм-аут происходит. Это означало бы, что линия:

print("This line does not print when freeze occurs") 

Нельзя было бы назвать это таймаутом на самом деле.

Вы идете исключение? Или любое другое исключение? Может случиться так, что это время, но вы просто этого не видите. Возможно, попробуйте что-то вроде этого:

try: 
    response = requests.head(poll_request_url, timeout=180) 
except requests.exceptions.Timeout: 
    print("Timeout occurred") 

Итак, вы можете видеть, что происходит.

РЕДАКТИРОВАТЬ: возможно, это шаг подключения, который не синхронизируется правильно. Это может быть большое значение тайм-аута для шага «connect» - это как-то испортить его. Возможно, пытаясь имея более короткий тайм-аут для этого (как указано здесь):

http://docs.python-requests.org/en/master/user/advanced/#timeouts

например

response = requests.head(poll_request_url, timeout=(3, 180)) 

В противном случае это может быть какая-то проблема поиска DNS? Возможно, посмотрите, не вызывает ли жесткая кодировка IP-адреса такая же проблема?

+3

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

+0

Я добавил еще немного контекста для кода, чтобы отразить обработку исключений. –

+1

Это должно быть не время ожидания во время шага подключения, как вы говорите, вы никогда не получаете запрос на сервере. –

1

Устранена проблема с использованием таймеров (из потокового импорта Timer). Если результат не следующий 10 секунд - повторите, если результат не следующий 10 секунд - напечатайте «Ошибка» и продолжайте. Вы не можете контролировать статус таймера с помощью инструкции if, если запрос зависает, но вы можете сделать это через цикл while, добавив время, если результат в порядке (Python: Run code every n seconds and restart timer on condition).