python - FTP:如何处理挂起和恢复下载?
问题描述
我每隔 6 小时左右定期通过 ftp 服务器下载一个 ~300 Mb 文件。大多数下载都很顺利,但有时进程挂起,我需要手动终止并重新启动。所以我想要一个更强大的下载系统,最好符合以下标准。
- 尽可能避免超时或挂起。如果它们发生,可以处理它们
- 如果下载被终止,请尝试恢复几次直到完成(如果在尝试的任何时间都不起作用,则发送错误消息)
对于(1),我在这个问题中读到,在所有块都被下载之前,最好将 python 线程与 keep_alive 调用一起使用。
def downloadFile(…):
ftp = FTP(…)
sock = ftp.transfercmd('RETR ' + filename)
def background():
f = open(…)
while True:
block = sock.recv(1024*1024)
if not block:
break
f.write(block)
sock.close()
t = threading.Thread(target=background)
t.start()
while t.is_alive():
t.join(60)
ftp.voidcmd('NOOP')
对于 (2),可能有一个循环来检查文件是否已完全下载。如果没有,它可以从原来的位置重新启动。基于这个问题。
for i in range(3):
if "Check if file has been completely downloaded":
if os.path.exists(filename):
restarg = {'rest': str(os.path.getsize(filename))}
else:
restarg = {}
ftp.transfercmd("RETR " + filename, **restarg)
但是如何结合(1)和(2)呢?您可以恢复线程下载吗?有许多我们甚至不知道下载顺序的块..
如果这两种方法不能结合起来,你还有什么别的想法吗?
另外,我不太确定如何判断 ftp 下载是否完成。我应该为此检查文件大小吗?文件大小可能会从一个下载更改为另一个。
解决方案
推荐阅读
- reactjs - 当 Reactjs 有功能组件作为父组件和子组件作为类时
- javascript - 解构赋值 vs array.map
- python - 计算 cv2.circle 内的白色像素
- excel - PowerBI DAX 测量性能极慢
- vim - 从名为 pipe(fifo) 的 UNIX 读取到 [neo]vim 缓冲区
- python - 使用 boto3 的变量值错误
- apache-flink - 就数据出口而言,基本的 Flink 流式传输问题
- php - Laravel eloquent group by hasMany 关系
- c# - 使用 IOptions 模式填充基类
- user-interface - 为多个区域和客户提供一个代码库