Я пишу FTP-клиент с использованием Twisted, который загружает много файлов, и пытаюсь сделать это довольно разумно.Однако у меня возникла проблема: я очень быстро загружаю несколько файлов (иногда ~ 20 на пакет, иногда ~ 250), а затем загрузка зависает, но в конечном итоге время ожидания соединения заканчивается, а затем начинается загрузка и зависаниеснова и сноваЯ использую DeferredSemaphore, чтобы загружать только 3 файла одновременно, но теперь я подозреваю, что это, вероятно, неправильный способ избежать регулирования сервера.
Вот код, о котором идет речь:
def downloadFiles(self, result, directory):
# make download directory if it doesn't already exist
if not os.path.exists(directory['filename']):
os.makedirs(directory['filename'])
log.msg("Downloading files in %r..." % directory['filename'])
files = filterFiles(None, self.fileListProtocol)
# from /1964109/ochered-udalennyh-zvonkov-perspektivnomu-brokeru-python-twisted#1964111
# use a DeferredSemaphore to limit the number of files downloaded simultaneously from the directory to 3
sem = DeferredSemaphore(3)
jobs = [sem.run(self.downloadFile, f, directory) for f in files]
d = gatherResults(jobs)
return d
def downloadFile(self, f, directory):
filename = os.path.join(directory['filename'], f['filename']).encode('ascii')
log.msg('Downloading %r...' % filename)
d = self.ftpClient.retrieveFile(filename, FTPFile(filename))
return d
Вы заметите, что я повторно использую FTP-соединение (кстати, активное) и использую свой собственный экземпляр FTPFile, чтобы убедиться, что локальный файловый объект закрывается, когда соединение для загрузки файла «потеряно» (т.е.завершено).Глядя на FTPClient Интересно, должен ли я использовать queueCommand напрямую.Честно говоря, я заблудился после команды retrieveFile до _openDataConnection и далее, поэтому, возможно, он уже используется.
Есть предложения?Спасибо!