使用pycurl进行FTP上载时调用Progress函数的频率太高

2024-06-16 09:11:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是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的性能,但是我需要回调函数来跟踪传输进度。在


Tags: path函数self版本getubuntuaptfilename
1条回答
网友
1楼 · 发布于 2024-06-16 09:11:51

请参阅编辑以获得更清洁的解决方案!在

我咬紧牙关,下载了libcurl和pycurl的最新源代码(实际上构建/安装非常容易)。这改善了这种情况,因为progress函数现在每秒只调用数百次,而不是数千次,但是在使用progress回调时,性能仍然会受到非常明显的影响。为了避免这种情况,我设置了如下传输:

# Set transfer parameters.
self.curlTransfer.fp = open(fileName, 'rb')
self.curlTransfer.fileSize = os.path.getsize(fileName)
self.curlTransfer.setopt(pycurl.URL, 'ftp://' + self.ipAddress + self.path + destination)
self.curlTransfer.setopt(pycurl.INFILESIZE_LARGE, self.curlTransfer.fileSize)
self.curlTransfer.setopt(pycurl.READDATA, self.curlTransfer.fp)

# Store file.
self.curlTransfer.perform()

如果我想在另一个线程中获得进展:

^{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的高性能。在

相关问题 更多 >