我的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
?我将它们显示为四舍五入,因此它不是一个真正的问题。
答案 0 :(得分:2)
不使用urllib2
,而是使用requests
library;它设置了TCP Keep-Alive option,让您检测到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