我正在使用 Twisted 编写一个下载大量文件的 FTP 客户端,并且我正在尝试非常聪明地做到这一点。但是,我一直遇到的问题是我会非常快速地下载几个文件(有时每批约 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 http://stackoverflow.com/questions/2861858/queue-remote-calls-to-a-python-twisted-perspective-broker/2862440#2862440
# 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。老实说,在检索文件命令到_openDataConnection及以后,我迷路了,所以也许它已经被使用了。
有什么建议么?谢谢!