2012-07-11 147 views
2

我正在使用Python的多处理功能来使用FTP进行批量下载。但是,当我尝试打开5个以上的FTP会话时,会引发EOFError,这意味着主持人打开太多会话而断开连接。有没有办法腌制FTP对象?

我看到的唯一解决方案是打开一个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高清需要访问FTP连接,如果我把它if __name__ == '__main__'块外,然后一个新的FTP连接创建的每个时间过程贯穿代码。

回答

2

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

  • 创建一批进程,下载的东西,在平行
  • ,但只使用一个FTP对象,实际上序列化下载

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

但是,不是序列化FTP对象,而是为FTP请求创建一个进程,并设计一个与该进程进行通信的迷你语言 - 让其他进程发送get src dst格式的邮件(易于拾取)。

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

所以,我这样做:

  • 创建MAX_CONNECTIONS(例如5)FTP工作进程
  • 接触有文件的队列中的主进程检索
  • 工作进程检索任务从队列中下载文件并检查主人是否有新东西要做
  • 重复,直到工作完成
+0

回答你问题:我假设并行下载会更快,即使只有一个FTP连接打开。这不是这种情况吗? – aensm 2012-07-11 14:46:16

+0

那么开始在同一个线程中的所有下载之间的区别是什么? – 2012-07-11 14:49:51

+0

如果我在同一个线程中进行所有下载,那么将分解下载列表成块并使多个进程同时下载文件要慢得多。您是否暗示单个FTP会话一次只能进行一个下载过程?因为如果是这样的话,是的,这会大大地破坏目的。 – aensm 2012-07-11 14:57:27

2

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

相关问题