从单个FTP服务器下载多线程/异步
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从单个FTP服务器下载多线程/异步相关的知识,希望对你有一定的参考价值。
我需要从单个服务器中的单个文件夹下载许多文件,因此我正在寻找一种更快速的方法。经过一点点的阅读后,似乎多线程或异步方法都可行,但我似乎无法使用这两种方法。
我正在使用的异步方法如下。这有效,即没有错误,但它一次只下载一个文件,因此不会提高速度。有没有修改它以便我提高速度?
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()
然后我尝试在多处理中使用简单的Pool()函数,如下所示:
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会话只限制了一个数据连接,所以你不能同时通过一个客户端连接下载多个文件,只能顺序下载。此外,您的代码将无法使用,因为您使用lazy list
。如果你想尝试加快下载速度,那么你需要多个客户端会话,但如果服务器没有限制下载速度,那么你就没有加速了。
另一答案
对于异步方法,您需要构建要下载的文件列表并同时调用它们。您只调用simple_get一次,因此只有1个下载实例正在运行。请参阅@ Klas-d提到的this example。
以上是关于从单个FTP服务器下载多线程/异步的主要内容,如果未能解决你的问题,请参考以下文章
python实现从FTP下载文件通过多线程同时分发到多台机器