我有下面的代碼:如何使用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