2012-07-11 122 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對象。

相關問題