Python 有没有办法对FTP对象进行pickle处理?

Python 有没有办法对FTP对象进行pickle处理?,python,ftp,multiprocessing,pickle,ftplib,Python,Ftp,Multiprocessing,Pickle,Ftplib,我正在使用Python的多处理来使用FTP进行批量下载。但是,当我尝试打开5个以上的ftp会话时,会引发EOFError,这意味着主机正在断开我打开过多会话的连接 我看到的唯一解决方案是打开单个FTP对象并将其传递给必要的方法。问题是,由于多处理使用pickle来移动对象,而FTP对象不能被pickle,所以这是不可能的。因此,我的问题是,是否有可能找到一种方法来pickle FTP对象来解决这个问题 我的代码的格式如下: def get_file(name): #code here

我正在使用Python的多处理来使用FTP进行批量下载。但是,当我尝试打开5个以上的ftp会话时,会引发EOFError,这意味着主机正在断开我打开过多会话的连接

我看到的唯一解决方案是打开单个FTP对象并将其传递给必要的方法。问题是,由于多处理使用pickle来移动对象,而FTP对象不能被pickle,所以这是不可能的。因此,我的问题是,是否有可能找到一种方法来pickle FTP对象来解决这个问题

我的代码的格式如下:

def get_file(name):
    #code here    

def worker(name_list, out_q):
    lst = []
    for name in name_list:
        lst.append(get_file(name))
    out_q.put(lst)

if __name__ == '__main__':

    #est ftp cnxn
    ftp = FTP('ftp.blah.blah', 'anonymous', 'meow')

    #multiprocessing code here

get_file def需要访问ftp连接,如果我将它放在if uuu name uuu='\uuuu main_uu'块之外,那么每次进程运行代码时都会创建一个新的ftp连接。

您可以通过创建一个封装ftp对象的可pickle类来解决这个问题。本质上,您可以在包装器类中绑定FTP构造函数参数,然后在远程主机上对其进行反序列化后,FTP对象将在那里实例化。

您可以通过创建包装FTP对象的可pickle类来解决此问题。本质上,您可以在包装类中绑定FTP构造函数参数,然后在远程主机上反序列化FTP对象后,FTP对象就会在那里实例化。

我真的不明白您为什么要这样做:

创建一系列并行下载的过程 但只使用一个FTP对象,实际上是序列化下载 这到底是如何解决你的问题的

但是,不要序列化FTP对象,而是为FTP请求创建一个进程,并设计一种与该进程通信的微型语言——让您的其他进程发送get src dst形式的易于处理的消息

编辑:刚刚检查了[ftplib][1]的文档。它没有说它可以处理多个电话。假设没有

所以,我会这样做:

创建最多\u个连接,例如5个FTP工作进程 请与具有要检索的文件队列的主进程联系 工作进程从队列中检索任务,下载文件并检查主进程是否有新任务要做 重复上述步骤,直到工作完成
我真的不明白你为什么要这么做:

创建一系列并行下载的过程 但只使用一个FTP对象,实际上是序列化下载 这到底是如何解决你的问题的

但是,不要序列化FTP对象,而是为FTP请求创建一个进程,并设计一种与该进程通信的微型语言——让您的其他进程发送get src dst形式的易于处理的消息

编辑:刚刚检查了[ftplib][1]的文档。它没有说它可以处理多个电话。假设没有

所以,我会这样做:

创建最多\u个连接,例如5个FTP工作进程 请与具有要检索的文件队列的主进程联系 工作进程从队列中检索任务,下载文件并检查主进程是否有新任务要做 重复上述步骤,直到工作完成
回答你的问题:我假设并行下载会快得多,即使只有一个FTP连接打开。不是这样吗?那么,在同一个线程中启动所有下载之间有什么区别呢?如果我在同一个线程中进行所有下载,那么这将比将下载列表分解成块并让多个进程同时下载文件慢得多。您是否暗示单个FTP会话一次只能执行一个下载过程?因为如果真是这样的话,是的,这将大大挫败目的。@aensm,对。我认为该会话不能同时处理多个下载。它也许能读懂来源,但我不这么认为。事实上,我不记得FTP协议本身能够做到这一点,但这在我的脑海中是相当模糊的。请参阅我的编辑,了解如何并行化。我想补充一点,就像Daren所说的,在一次会话中只能读取一个文件。如果要同时下载,必须打开多个会话。您可以打开的会话数量可能不是由客户端决定的,而是由服务器决定的。因此,请注意您计划使用的会话量,因为服务器可能有一天会减少会话量。回答您的问题:我假设并行下载会快得多,即使只有一个FTP连接打开。不是这样吗?那么,在同一个线程中启动所有下载之间有什么区别呢?如果我在同一个线程中进行所有下载,那么这将比将下载列表分解成块并让多个进程同时下载文件慢得多。您是否暗示单个FTP会话一次只能执行一个下载过程?因为如果真是这样的话,是的,这将大大挫败目的。@aensm,对。我不知道
我不认为会话可以同时处理多个下载。它也许能读懂来源,但我不这么认为。事实上,我不记得FTP协议本身能够做到这一点,但这在我的脑海中是相当模糊的。请参阅我的编辑,了解如何并行化。我想补充一点,就像Daren所说的,在一次会话中只能读取一个文件。如果要同时下载,必须打开多个会话。您可以打开的会话数量可能不是由客户端决定的,而是由服务器决定的。因此,请注意您计划使用的会话量,因为服务器可能有一天会减少会话量。