有没有办法腌制FTP对象?

时间:2012-07-11 14:17:26

标签: python ftp multiprocessing pickle ftplib

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

我看到的唯一解决方案是打开一个FTP对象并将其传递给必要的方法。问题是因为多处理使用酸洗来移动对象,并且FTP对象无法被腌制,所以这是不可能的。因此,我的问题是,是否有可能通过找到一种方法来解决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 __name__ == '__main__'块之外,那么每次进程运行代码时都会创建一个新的ftp连接。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

我真的不明白你为什么要那样做:

  • 创建一系列并行下载内容的流程
  • 但只使用一个FTP对象,实际上是序列化下载

这究竟是如何解决您的问题的?

但是,不是序列化FTP对象,而是为FTP请求创建一个流程,并设计一个迷你语言来与该流程进行通信 - 让您的其他流程发送(容易发送)形式get src dst的消息。 / p>

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

所以,我会这样做:

  • 创建MAX_CONNECTIONS(例如5)FTP工作进程
  • 联系具有要检索的文件队列的主进程
  • 工作进程从队列中检索任务,下载文件并检查master以查找要执行的新操作
  • 重复直到工作完成