我使用的是Ubuntu12.0.4,pycurl版本7.19和libcurl3版本7.22(pycurl和libcurl都是通过apt get直接从Ubuntu存储库安装的)。我上传文件的代码是(“self”是我的包装对象):
self.curlTransfer = pycurl.Curl()
self.curlTransfer.setopt(pycurl.UPLOAD, 1)
self.curlTransfer.setopt(pycurl.USERPWD, '%s:%s'%(str(self.userName), str(self.password)))
self.curlTransfer.setopt(pycurl.NOPROGRESS, 0)
self.curlTransfer.setopt(pycurl.PROGRESSFUNCTION, self.__UpdateFileTransferProgress)
f = open(fileName, 'rb')
self.curlTransfer.setopt(pycurl.URL, 'ftp://' + self.ipAddress + self.path + destination)
self.curlTransfer.setopt(pycurl.INFILESIZE_LARGE, os.path.getsize(fileName))
self.curlTransfer.setopt(pycurl.READFUNCTION, f.read)
self.curlTransfer.perform()
我的回调函数“uuUpdateFileTransferProgress”每秒被调用数千次,传输速度比关闭进度回调慢3倍左右。为了解决这个问题,我已经搜索了很多地方,唯一相关的是this curl bug report。听起来这个bug可能已经被修补过了,但是还不清楚这个补丁是否已经在我的版本中出现过(或者这是一个完全不同的问题)。在
有人见过这个吗?我试图手动更新到最新的libcurl/pycurl版本,但试图解决依赖关系使我望而却步。与ftplib(当进度回调被禁用时)相比,我真的很喜欢pycurl的性能,但是我需要回调函数来跟踪传输进度。在
请参阅编辑以获得更清洁的解决方案!在
我咬紧牙关,下载了libcurl和pycurl的最新源代码(实际上构建/安装非常容易)。这改善了这种情况,因为progress函数现在每秒只调用数百次,而不是数千次,但是在使用progress回调时,性能仍然会受到非常明显的影响。为了避免这种情况,我设置了如下传输:
如果我想在另一个线程中获得进展:
^{pr2}$基本上,我作弊并使用文件指针“tell”查看pycurl在传输中的位置。在
Edit/Solved:我最终通过修改/lib/progress.c来修复libcurl中的bug,如我的OP(Imgur link)中的bug报告线程所示。听起来他们在主干源代码中提交了修复程序,但在他们的最新版本(7.37.1)中没有包含它。我之所以走这条路,是因为停止传输的最干净的方法是从progress函数返回非零。您可以从pycurl.READFUNCTION要停止传输,但使用FTP上载,则每个块调用一次该函数(~16KB),速度非常慢(使用pycurl.READDATA而是提供一个文件指针)。现在我可以清楚地停止传输,使用它们预期的进度更新方法,并保持libcurl的高性能。在
相关问题 更多 >
编程相关推荐