在Windows上的Python 2.5中下载时,urlopen错误10045,’地址已在使用’

我正在编写将在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'>>

这个链接: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()

更新:我通过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()

如果你想要你可以插入一个睡眠,或者你可以依赖它

在我的win-xp上问题没有出现(我下载了5000次)

我用process hacker观察我的流程和网络.

转载注明原文:在Windows上的Python 2.5中下载时,urlopen错误10045,’地址已在使用’ - 代码日志