我有一个Python脚本连接到远程FTP服务器并下载文件。由于我连接的服务器不是非常可靠,因此经常发生传输停滞和传输速率变得非常低的情况。然而,没有错误被抛出,所以我的脚本也停止了。
我使用ftplib
模块,具有retrbinary
功能。我希望能够设置一个超时值后,下载中止,然后自动重试/重新启动传输(恢复会很好,但这不是严格必要的,因为文件只有~300M)。
我使用threading
模块管理了我需要做的事情:
conn = FTP(hostname, timeout=60.)
conn.set_pasv(True)
conn.login()
while True:
localfile = open(local_filename, "wb")
try:
dlthread = threading.Thread(target=conn.retrbinary,
args=("RETR {0}".format(remote_filename), localfile.write))
dlthread.start()
dlthread.join(timeout=60.)
if not dlthread.is_alive():
break
del dlthread
print("download didn't complete within {timeout}s. "
"waiting for 10s ...".format(timeout=60))
time.sleep(10)
print("restarting thread")
except KeyboardInterrupt:
raise
except:
pass
localfile.close()
FTP类的timeout参数http://docs.python.org/2/library/ftplib.html#ftplib.FTP