Sch*_*hof 5 python windows http download urllib2
我正在编写将在Linux,OS X和Windows上运行的代码.它从服务器下载大约55,000个文件的列表,然后逐步检查文件列表,检查文件是否存在于本地.(使用SHA哈希验证和一些其他好东西.)如果文件不在本地存在或哈希不匹配,则下载它们.
服务器端在Ubuntu上通过端口80是普通的Apache 2.
客户端在Mac和Linux上运行良好,但在下载了大量文件后,在Windows(XP和Vista)上给出了这个错误:
urllib2.URLError: <urlopen error <10048, 'Address already in use'>>
Run Code Online (Sandbox Code Playgroud)
这个链接:http://bytes.com/topic/python/answers/530949-client-side-tcp-socket-receiving-address-already-use-upon-connect指向TCP端口耗尽,但"netstat -n "从来没有在"TIME_WAIT"状态下向我显示超过六个连接,即使在它出错之前.
代码(对于下载的55,000个文件中的每个文件都调用一次)是这样的:
request = urllib2.Request(file_remote_path)
opener = urllib2.build_opener()
datastream = opener.open(request)
outfileobj = open(temp_file_path, 'wb')
try:
while True:
chunk = datastream.read(CHUNK_SIZE)
if chunk == '':
break
else:
outfileobj.write(chunk)
finally:
outfileobj = outfileobj.close()
datastream.close()
Run Code Online (Sandbox Code Playgroud)
更新:我通过greping日志发现它正好进入下载例程3998次.我已经多次运行它,每次都失败了3998.鉴于链接文章指出可用端口是5000-1025 = 3975(有些可能已到期并被重用),它开始看起来更像链接文章描述真正的问题.但是,我仍然不确定如何解决这个问题.进行注册表编辑不是一种选择.
如果它确实是一个资源问题(释放os套接字资源)
试试这个:
request = urllib2.Request(file_remote_path)
opener = urllib2.build_opener()
retry = 3 # 3 tries
while retry :
try :
datastream = opener.open(request)
except urllib2.URLError, ue:
if ue.reason.find('10048') > -1 :
if retry :
retry -= 1
else :
raise urllib2.URLError("Address already in use / retries exhausted")
else :
retry = 0
if datastream :
retry = 0
outfileobj = open(temp_file_path, 'wb')
try:
while True:
chunk = datastream.read(CHUNK_SIZE)
if chunk == '':
break
else:
outfileobj.write(chunk)
finally:
outfileobj = outfileobj.close()
datastream.close()
Run Code Online (Sandbox Code Playgroud)
如果你想要你可以插入一个睡眠,或者你可以依赖它
在我的win-xp上问题没有出现(我下载了5000次)
我通过进程黑客观察我的进程和网络.