我需要从单个服务器中的单个文件夹下载许多文件,因此我正在寻找一种更快的方法。经过一番阅读后,似乎多线程或异步方法可以起作用,但是我似乎无法获得任何一种工作方法。
我正在使用的异步方法如下。这起作用,即没有错误,但一次只能下载一个文件,因此不能提高速度。是否有修改它以提高速度?
async def get_file(self):
async with aioftp.ClientSession(self.host, self.port, self.login, self.password) as client:
async for path, info in client.list(recursive=True):
if info["type"] == "file":
await client.download(path, destination=self.dest_dir,write_into=True, block_size=self.block_size)
def async_update(self):
loop = asyncio.get_event_loop()
loop.run_until_complete(self.get_file())
loop.close()
然后,我尝试在以下多处理中使用简单池()func:
def simple_fetch(self,file)
file = open(self.dest_dir+filename, 'wb')
ftp.retrbinary('RETR ' + filename, file.write, 8192*(2^3)) #, 8192)
file.close()
def multi_fetch(self):
pool = Pool()
pool.map(self.simple_fetch,self.update_files)
pool.close()
pool.join()
,但这会失败。我返回服务器后,我会尽快使用该错误。
我是aioftp
的作者。您实际上无法加快下载FTP的原因是FTP会话的限制恰好是一个数据连接,因此您不能同时通过一个客户端连接下载多个文件,而只能顺序。另外,您的代码将不起作用,因为您使用懒惰的list
。如果您想尝试加快下载速度,那么您需要多个客户端会话,但是如果服务器没有油门的下载速度,那么您就没有速度。
对于异步方法,您将需要构建一个文件列表以下载并同时致电。您仅一次调用Simple_get,因此只有1个实例正在运行。请参见此示例,如 @klas-d。