как правильно израсходовать время при загрузке с питоном - PullRequest
9 голосов
/ 02 марта 2009

Я загружаю огромный цикл файлов со следующим кодом в цикле:

try:
    urllib.urlretrieve(url2download, destination_on_local_filesystem)
except KeyboardInterrupt:
    break
except:
    print "Timed-out or got some other exception: "+url2download

Если время ожидания сервера по URL-адресу url2download, когда соединение только начинается, последнее исключение обрабатывается правильно. Но иногда сервер отвечал, и загрузка начиналась, но сервер был настолько медленным, что даже часу понадобился бы даже один файл, и в итоге он возвращал что-то вроде:

Enter username for Clients Only at albrightandomalley.com:
Enter password for  in Clients Only at albrightandomalley.com:

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

Мое намерение в этой ситуации было бы - пропустить этот файл и перейти к следующему. Вопрос - как это сделать? Есть ли в python способ указать, как долго можно работать над загрузкой одного файла, и если больше времени уже потрачено, прерывать и идти вперед?

Ответы [ 4 ]

8 голосов
/ 20 октября 2014

Попробуйте:

import socket

socket.setdefaulttimeout(30)

4 голосов
/ 02 марта 2009

Если вы не ограничены тем, что поставляется с Python из коробки, тогда вам может пригодиться модуль urlgrabber :

import urlgrabber
urlgrabber.urlgrab(url2download, destination_on_local_filesystem,
                   timeout=30.0)
3 голосов
/ 02 марта 2009

Здесь обсуждается это здесь . Предостережения (в дополнение к тем, что они упоминают): я не пробовал, и они используют urllib2, а не urllib (это будет проблемой для вас?) (Собственно, теперь, когда я об этом думаю эта техника, вероятно, будет работать и для urllib).

2 голосов
/ 02 марта 2009

Этот вопрос носит более общий характер по поводу отключения функции: Как ограничить время выполнения вызова функции в Python

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

http://code.google.com/p/psftplib/source/browse/trunk/psftplib.py

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...