Code Bye

C调用Python一个运行时间长的函数,怎么样实时获取中间结果

开发工作如下:
使用Python写了一个FTP客户端组件,支持上传与下载,使用C调用该FTP客户端组件的上传与下载都成功。
问题点:
C调用上传与下载时,需要实时获取上传或进度(即已经上传了多少,或下载了多少),并把这个值复制到某个共享变量中,给其它线程读取使用(只读取)。
但是文件上传与下载的部分全是在Python中写的,进度也只有Python才能知道。
使用Python的线程机制,貌似也不能成功。
问一下各位高手,谁遇到过相似的问题,并解决的?
解决方案

25

python代码中的download函数又是怎么样显示进度的?
你的整个下载过程都写到一个函数里了,要调用完毕这个函数才获得结果,而且函数调用完毕的时候整个文件都下载完毕了。
先不说C怎么样调用的问题,你先解决这样的一个问题:
假设你的这个download函数拿给别人用,别人用python调用你的download函数,怎么样实时获取进度并print()输出到屏幕上?
(注意,你写好代码拿给别人用,别人只能调用你写的代码,不能修改你的代码,就像标准库中的那些东西一样,你一般都只是调用,不会去修改它的代码)
所以这其实是个接口设计问题。
一个函数的调用需要很长时间才能完成,怎么样让调用者获取执行过程的进度,此类问题有多种解决方案:
1.拆分download函数,分步骤实现文件的下载,例如可以拆分成几个函数
打开连接()
获取文件大小()
读一部分(size)
关闭连接()
这样别人调用的时候,可以在一个循环中反复调用   读一部分()并通过参数指定要读多少,这样调用者可以很好的知道进度。
Winhttp/Wininet等HTTP库在下载文件的时候都采用此办法
2.回调
download应提供一个参数以接收调用者提供的函数指针(或函数对象),download在下载过程中,每下载%5就调用一下这个回调函数通知调用者,这样调用者可以在回调函数中显示进度。
urllib使用的就是这种方式。
3.其它方法,如使用windows消息、事件来通知调用者,具有平台依赖性,用得较少

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C调用Python一个运行时间长的函数,怎么样实时获取中间结果