Как я могу заставить urllib2 тайм-аут? - PullRequest
6 голосов
/ 15 ноября 2010

Я хочу протестировать обработку тайм-аутов моим приложением при получении данных через urllib2, и мне нужен какой-то способ заставить запрос тайм-аут.

Если не найти очень медленное интернет-соединение, какой метод я могу использовать?

Кажется, я помню интересное приложение / набор для моделирования подобных вещей.Может кто знает ссылку?

Ответы [ 5 ]

10 голосов
/ 16 ноября 2010

Я обычно использую netcat для прослушивания порта 80 моей локальной машины:

nc -l 80

Затем я использую http://localhost/ в качестве URL-адреса запроса в моем приложении. Netcat ответит через http-порт, но никогда не даст ответа, поэтому время ожидания запроса гарантировано, если вы указали тайм-аут в своем вызове urllib2.urlopen() или по телефону socket.setdefaulttimeout().

.
6 голосов
/ 16 ноября 2010

Вы можете установить тайм-аут по умолчанию, как показано выше, но вы можете использовать их оба, поскольку в Python 2.6 есть опция тайм-аута в методе urlopen:

import urllib2
import socket

try:
    response = urllib2.urlopen("http://google.com", None, 2.5)
except URLError, e:
    print "Oops, timed out?"
except socket.timeout:
    print "Timed out!"

Тайм-аут по умолчанию для urllib2 бесконечен, и импорт сокета гарантирует, что вы поймаете тайм-аут как исключение socket.timeout

3 голосов
/ 16 ноября 2010
import socket 

socket.setdefaulttimeout(2) # set time out to 2 second.

Если вы хотите установить время ожидания для каждого запроса, вы можете использовать аргумент времени ожидания для urlopen

0 голосов
/ 16 ноября 2010

Если вы работаете на Mac, speedlimit очень круто.

Там также dummynet . Это намного более хардкорный, но он также позволяет вам делать гораздо более интересные вещи. Вот предварительно настроенный образ виртуальной машины .

Если вы уже работаете на Linux, есть netem .

Мне кажется, я слышал об инструменте для Windows под названием TrafficShaper, но я его не проверял.

0 голосов
/ 16 ноября 2010

почему бы не написать очень простой CGI-скрипт на bash, который просто спит в течение требуемого периода ожидания?

...