Python 在具有多线程的Paramiko中,是否有必要为每个线程打开一个SFTPClient?
我想使用带多线程的Paramiko从远程服务器下载文件 我想到了两个解决方案,但我不确定哪一个是正确的(或更好的) 解决方案1: 假设Python 在具有多线程的Paramiko中,是否有必要为每个线程打开一个SFTPClient?,python,multithreading,ssh,sftp,paramiko,Python,Multithreading,Ssh,Sftp,Paramiko,我想使用带多线程的Paramiko从远程服务器下载文件 我想到了两个解决方案,但我不确定哪一个是正确的(或更好的) 解决方案1: 假设SFTPClient.get是线程安全的(但我找不到任何提到这一点的文档),一个简单的示例如下: from paramiko import SSHClient, AutoAddPolicy, SFTPClient from concurrent.futures import ThreadPoolExecutor from typing import List c
SFTPClient.get
是线程安全的(但我找不到任何提到这一点的文档),一个简单的示例如下:
from paramiko import SSHClient, AutoAddPolicy, SFTPClient
from concurrent.futures import ThreadPoolExecutor
from typing import List
client = SSHClient()
ciient.set_missing_host_key_policy(AutoAddPolicy())
client.connect( ... )
sftp = client.open_sftp()
files_to_download: List[str] = ...
with ThreadPoolExecutor(10) as pool:
pool.map(lambda fn: sftp.get(fn, fn), files_to_download)
解决方案2:解决方案1中有两个问题
from paramiko import SSHClient, AutoAddPolicy, SFTPClient
from concurrent.futures import ThreadPoolExecutor
from threading import Lock, local
from typing import List
client = SSHClient()
ciient.set_missing_host_key_policy(AutoAddPolicy())
client.connect( ... )
thread_local = local()
thread_lock = Lock()
files_to_download: List[str] = ...
def download(fn: str) -> None:
"""
thread-safe and each thread has its own SFTPClient
"""
if not hasattr(thread_local, 'sftp'):
with thread_lock:
thread_local.sftp = client.open_sftp()
thread_local.sftp.get(fn, fn)
with ThreadPoolExecutor(10) as pool:
pool.map(download, files_to_download)
哪种解决方案更好?Paramiko不是线程安全的 在一个连接上使用多个线程可能不会给您带来希望的性能。您必须为每个线程打开一个单独的连接(
SSHClient
/SFTPClient
)
使用一个连接,只有在传输大量小文件的情况下,才能获得更好的性能。为此,请参见