Как поставить команды FTP в Twisted? - PullRequest
2 голосов
/ 09 ноября 2010

Я пишу 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 и далее, поэтому, возможно, он уже используется.

Есть предложения?Спасибо!

1 Ответ

1 голос
/ 09 ноября 2010

Я бы предложил использовать queueCommand, поскольку вы предположили, что я подозреваю, что используемый вами семафор, вероятно, вызывает у вас проблемы.Я считаю, что использование queueCommand ограничит ваш FTPClient одним активным соединением (хотя я просто размышляю), поэтому вы можете подумать о создании нескольких экземпляров FTPClient и передаче им заданий загрузки, если вы хотите сделать что-то быстро.Если вы используете queueStringCommand , вы получите Deferred, который можно использовать для определения местоположения каждого клиента, и даже добавите еще одно задание в очередь для этого клиента в обратном вызове.

...