Helpers - компьютеры, интернет, программирование

Python urllib2 не учитывает тайм-аут

Следующие две строки кода зависают навсегда:

import urllib2
urllib2.urlopen('https://www.5giay.vn/', timeout=5)

Это с python2.7, и у меня нет http_proxy или каких-либо других переменных env. Любой другой сайт работает нормально. Я также могу запустить сайт без каких-либо проблем. В чем может быть проблема?

06.12.2014

  • Я вижу это как в Linux (Amazon AMI), так и в Mac OS. Кроме того, похоже, это не связано с DNS, потому что даже это зависает: urllib2.urlopen('210.245.123.158', timeout =1) 06.12.2014

Ответы:


1

Если вы запустите

import urllib2

url = 'https://www.5giay.vn/'
urllib2.urlopen(url, timeout=1.0)

подождите несколько секунд, а затем используйте C-c, чтобы прервать программу, вы увидите

  File "/usr/lib/python2.7/ssl.py", line 260, in read
    return self._sslobj.read(len)
KeyboardInterrupt

Это показывает, что программа зависла на self._sslobj.read(len).

Время ожидания SSL увеличивается на socket.timeout.

Вы можете управлять задержкой до того, как socket.timeout будет поднят, вызвав socket.setdefaulttimeout(1.0).

Например,

import urllib2
import socket

socket.setdefaulttimeout(1.0)
url = 'https://www.5giay.vn/'
try:
    urllib2.urlopen(url, timeout=1.0)
except IOError as err:
    print('timeout')

% time script.py
timeout

real    0m3.629s
user    0m0.020s
sys 0m0.024s

Обратите внимание, что модуль запросов работает успешно, хотя urllib2 нет:

import requests
r = requests.get('https://www.5giay.vn/')

Как установить тайм-аут для всего вызова функции:

socket.setdefaulttimeout влияет только на то, как долго Python ожидает, прежде чем возникнет исключение, если сервер не выдал ответа.

Ни он, ни urlopen(..., timeout=...) не устанавливают ограничения по времени для всего вызова функции.

Для этого вы можете использовать события, как показано здесь.

Если вы не хотите устанавливать eventlets, вы можете использовать multiprocessing из стандартной библиотеки; хотя это решение не будет масштабироваться так же хорошо, как асинхронное решение, такое как eventlets.

import urllib2
import socket
import multiprocessing as mp

def timeout(t, cmd, *args, **kwds):
    pool = mp.Pool(processes=1)
    result = pool.apply_async(cmd, args=args, kwds=kwds)
    try:
        retval = result.get(timeout=t)
    except mp.TimeoutError as err:
        pool.terminate()
        pool.join()
        raise
    else:
        return retval

def open(url):
    response = urllib2.urlopen(url)
    print(response)

url = 'https://www.5giay.vn/'
try:
    timeout(5, open, url)
except mp.TimeoutError as err:
    print('timeout')

Выполнение этого либо завершится успешно, либо истечет время ожидания примерно через 5 секунд настенных часов.

06.12.2014
  • Спасибо за расследование. При тайм-ауте 1 время ожидания истекает. Но если сделать таймаут=5.0, то зависает навсегда. Странный! 06.12.2014
  • Спасибо, в данном случае веб-сервер был неправильно настроен, отправляя 1 символ каждую секунду. Так что тайм-аут не бил, и все равно запрос будет длиться вечно. 07.12.2014
  • Новые материалы

    Интуитивное понимание тензоров в машинном обучении
    Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

    Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
    Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

    Почему объяснимость так важна прямо сейчас?
    По мере того, как системы искусственного интеллекта и инструменты на основе машинного обучения распространяются в нашей повседневной жизни, как практики, так и критики все чаще заявляют о..

    Анимированный математический анализ
    Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

    Создание простого слайдера изображений с помощью JavaScript
    Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

    Создание базы данных с помощью супергероя «Python»
    В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

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