0

我的 ISP 每天强制断开我的连接一次。如果在下载期间发生这种情况,则下载将永远暂停,而不会引发任何异常。

现在我只能考虑线程下载,然后检查最大时间或不时读取文件大小,然后检查它是否仍在增长。

我现在正在使用的功能:

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?我将它们显示为四舍五入的整数,所以这不是一个真正的问题。

4

1 回答 1

2

urllib2使用requests而不是使用;它设置TCP Keep-Alive 选项,让您检测 ISP 断开连接。

您可能需要设置额外的套接字选项;该urllib3库用于select检测套接字是否仍然可用,并设置超时,但是向套接字添加显式 KEEPALIVE 选项应该会使检测更加顺畅:

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
于 2013-09-24T09:07:04.447 回答