2

我正在使用 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 连接。

4

2 回答 2

2

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

于 2012-07-11T14:28:17.597 回答
2

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

  • 创建一堆进程来并行下载东西
  • 但只使用一个 FTP 对象,实际上是序列化下载

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

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

编辑:刚刚检查了[ftplib][1]. 它没有说它可以处理多个呼叫。假设没有!

所以,我会这样做:

  • 创建MAX_CONNECTIONS(例如 5 个)FTP 工作进程
  • 联系具有要检索的文件队列的主进程
  • 工作进程从队列中检索任务,下载文件并检查 master 是否有新的事情要做
  • 重复直到工作完成
于 2012-07-11T14:34:53.443 回答