2013-09-24 2 views
0

Мой интернет-провайдер отключает подключение к моему соединению один раз в день. Если это происходит во время загрузки, загрузка просто приостанавливается, но не исключает никакого исключения.24-часовое отключение интернет-пауз скачать бесплатно

Прямо сейчас я мог только подумать о потоковой загрузке, а затем проверить максимальное время или прочитать файл evey сейчас, а затем проверить, продолжает ли он расти.

функции я использую прямо сейчас:

def download_with_progress(url,localFileName,overwrite=False): 
    if not os.path.exists(localFileName) or overwrite == True: 
     urlretrieve(url, localFileName, reporthook=print_progress) 
     sys.stdout.write("\r") #remove previously printed percent sign 
     sys.stdout.flush() 

def print_progress(count, blockSize, totalSize): 
    total_MB = (totalSize)/(1000 * 1000) 
    current_MB = (blockSize * count)/(1000 * 1000) 
    percent = int(count*blockSize*100/totalSize)   
    sys.stdout.write("\r%d%% (%d/%d MB)" % (percent, current_MB, total_MB)) 
    sys.stdout.flush() 

Поскольку я уже здесь: это total_MB или current_MB правильно рассчитывается таким образом? Или я должен делить на 1024 * 1024? Я показываю их как закругленные int, так что это не проблема.

+0

Название вашего поста не имеет ничего общего с вопрос, который вы задаете. Какова фактическая проблема, которую вы хотите решить? –

+0

Моя функция загрузки работает нормально, но если соединение с Интернетом потеряно (за 5 секунд), загрузка навсегда заморожена. Это не исключение, а просто зависает. – Wurstbro

ответ

2

Вместо использования urllib2 используйте requests library; он устанавливает TCP Keep-Alive option, позволяя вам обнаруживать разъединения ISP.

Возможно, вам потребуется установить дополнительные параметры гнезда; urllib3 библиотеки использует select обнаружить, если сокеты все еще доступны, и устанавливает время ожидания, но добавление явного параметра KEEPALIVE к гнезду должна сделать обнаружение, немного Smoother еще:

import httplib 
import socket 

orig_connect = httplib.HTTPConnection.connect 
def new_connect(self): 
    orig_connect(self) 
    self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) 
httplib.HTTPConnection.connect = new_connect 
+0

выглядит хорошо, проверит его – Wurstbro

+0

Можете ли вы рассказать мне, как устанавливать/копировать запросы таким образом, чтобы я мог отправить его с моей программой в одну папку? – Wurstbro

+0

Если он находится в той же папке, что и ваш скрипт, вы можете использовать его напрямую. Вы также можете добавить отдельный поддиск 'packages' и добавить этот каталог в' sys.path'. 'request' использует подпакет' packages' и импортирует из 'request.packages. ' для зависимостей. –

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