使用Multiprocessing和PySftp进行并行下载

2024-04-19 13:06:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个代码,使用pysftp和多处理libs下载同一类型的N个文件。我做了一个基本的python培训,得到了一些代码并将它们组合成一个,但我无法实现。如果有人帮我,我会很感激的。错误发生在vFtp.关闭()命令。在假设开始同步下载的部分。在

from multiprocessing import Pool
import pysftp
import os

vHost='10.11.12.13'
vLogin='admin'
vPwd='pass1234'
vFtpPath='/export/home/'

os.chdir('d:/test/')
os.getcwd()

cnopts=pysftp.CnOpts()
cnopts.hostkeys = None

vFtp=pysftp.Connection(vHost,username=vLogin,password=vPwd,cnopts=cnopts)
vFtp.cwd(vFtpPath)
vObjectList=vFtp.listdir()
vFileList=[]
vFoldList=[]

for vObject in vObjectList:
    vType=str(vFtp.lstat(vObject))[:1]
    if vType!='d': 
        vFileList.append(vObject)
    else:   
        vFoldList.append(vObject)

vFtp.close()

def fDownload(vFileAux):
    vFtpAux=pysftp.Connection(vHost,username=vLogin,password=vPwd,cnopts=cnopts)
    vFtpAux.cwd(vFtpPath)
    vFtpAux.get(vFileAux,preserve_mtime=True)
    vFtpAux.close()

if __name__ == "__main__":
    vPool=Pool(3)
    vPool.map(fDownload,vFileList)  

Tags: 代码importosconnectionvobjectpoolvhostpysftp
1条回答
网友
1楼 · 发布于 2024-04-19 13:06:36

看起来您正在尝试获取文件列表,然后使用多个进程同时下载它们。在

不要手动检查文件,而是尝试对connection对象使用walktree方法:pysftp walktree

下面是我用Python3.5制作的一个工作示例。我只是使用一个本地ftp服务器和一些小文件,所以我模拟了下载延迟。更改max_workers参数以设置同时下载的数量。在

^{1}$

edit:ProcessPoolExecutor用于在多个cpu核心上运行某些东西,并且将受到处理器的限制。对于像下载这样的网络任务,您可以使用线程代替。在上面的代码中,这只是一个更改:而不是ProcessPoolExecutor导入并使用ThreadPoolExecutor。然后您可以使用更多max_workers。在

相关问题 更多 >