Я пишу код, который будет работать в Linux, OS X и Windows. Он загружает список приблизительно из 55 000 файлов с сервера, затем просматривает список файлов, проверяя, присутствуют ли файлы локально. (С проверкой хэша SHA и несколькими другими полезностями.) Если файлы отсутствуют локально или хеш не совпадает, он загружает их.
На стороне сервера установлен простой Apache 2 в Ubuntu через порт 80.
Клиентская сторона отлично работает на 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()
ОБНОВЛЕНИЕ: я обнаружил, что, заносив журнал, он входит в процедуру загрузки ровно 3998 раз. Я запускал это несколько раз, и каждый раз это не удается на 3998. Учитывая, что в связанной статье утверждается, что доступные порты 5000-1025 = 3975 (а некоторые, вероятно, истекают и используются повторно), это начинает выглядеть намного больше, как в связанной статье описывается реальная проблема. Тем не менее, я все еще не уверен, как это исправить. Вносить изменения в реестр нельзя.