我有下面的代码:如何使用Twisted通过FTP下载文件时关闭文件对象?
for f in fileListProtocol.files:
if f['filetype'] == '-':
filename = os.path.join(directory['filename'], f['filename'])
print 'Downloading %s...' % (filename)
newFile = open(filename, 'w+')
d = ftpClient.retrieveFile(filename, FileConsumer(newFile))
d.addCallback(closeFile, newFile)
不幸的是,下载的文件1000+数百在有关目录之后,我得到一个IOError约太多打开的文件。为什么当我在下载完成后关闭每个文件?如果有更习惯的方式来处理下载大量文件的整个任务,我很乐意听到它。谢谢。
更新:让 - 保罗的DeferredSemaphore
例子加马特的FTPFile
做了伎俩。出于某种原因,使用Cooperator
而不是DeferredSemaphore
会下载几个文件,然后失败,因为FTP连接已经死亡。
“FTPClient”序列化命令,你不应该需要JP的并行化技术。问题在于你的FileConsumer在实例化时处理文件句柄,并且当下载完成时他们没有关闭文件,我期望你的'd.addCallback(closeFile,newFile)'不能按预期工作。我提供的类仅在需要时打开文件,并在完成时关闭它,因为它以'retrieveFile'预期的方式支持协议接口。 – MattH 2010-08-11 13:36:43
好的,很酷。谢谢,马特。 – pr1001 2010-08-11 14:46:17