2013-08-22 76 views
3

我有寫入文件到s3的代碼。代碼工作正常python s3 boto connection.close導致錯誤

conn = S3Connection(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) 
    bucket = conn.get_bucket(BUCKET, validate=False) 
    k = Key(bucket) 
    k.key = self.filekey 
    k.set_metadata('Content-Type', 'text/javascript') 
    k.set_contents_from_string(json.dumps(self.output)) 
    k.set_acl(FILE_ACL) 

這工作得很好。這時我才發現,我不關閉我的連接,所以我說這行結尾:

conn.close() 

現在,文件寫入爲之前,我在我的日誌中看到此錯誤現在

S3Connection instance has no attribute '_cache', unable to write file 

任何人看到我在做什麼錯在這裏或知道是什麼造成這種情況?我注意到,沒有在博託示人,關閉連接,但我知道你應該關閉你的IO操作的連接,作爲一般規則,教程...

編輯 關於這個的注意事項,當我註釋掉conn.close()的錯誤消失

+0

最近碰到了同樣的概念恐懼......你對這個話題有所瞭解嗎? – GarciadelCastillo

+0

@GarciadelCastillo我沒有。抱歉。剛剛結束了對conn.close()的評論,並且它按照希望工作。 – Brad

+0

所以解決方案是......不關閉連接? –

回答

13

我無法在最新boto源代碼中找到該錯誤消息,所以很遺憾,我不能告訴你是什麼原因造成的。最近,我們在撥打conn.close()時遇到了問題,所以至少有一種情況必須關閉連接。這是我對事件的理解:

S3Connection(以及它的父類)透明地處理幾乎所有的連接細節,你不應該考慮關閉資源,重新連接等。這就是爲什麼大多數教程和文檔沒有提到關閉資源。事實上,我只知道一種情況,你應該明確地關閉資源,我在底部描述。請繼續閱讀!

在封面下,boto使用httplib。此客戶端庫支持HTTP 1.1 Keep-Alive,因此它可以並應該保持套接字處於打開狀態,以便它可以通過同一連接執行多個請求。

AWS將被關閉的原因有兩個連接(插座):

  1. 按照博託源代碼,「AWS開始後三分鐘時間的事情了。」據推測,「事物」意味着「空閒連接」。
  2. 根據Best Practices for Using Amazon S3,「S3在關閉連接前會接受多達100個請求(導致」連接重置「)。」

幸運的是,boto通過在三分鐘之前回收舊的連接來解決第一種情況。遺憾的是,boto並沒有如此透明地處理第二種情況:

當AWS關閉一個連接時,連接結束進入CLOSE_WAIT,這表示套接字正在等待應用程序執行close()。 S3Connection以透明的方式處理連接詳細信息,以至於您無法直接執行此操作!最好防止它首先發生。

因此,回到當您需要明確關閉時的原始問題,如果您的應用程序運行很長時間,長時間保留對boto連接的引用(並重復使用),並且會發出很多boto S3請求(因此觸發了AWS上的「連接重置」),那麼您可能會發現越來越多的套接字位於CLOSE_WAIT中。你可以通過調用netstat | grep CLOSE_WAIT在linux上檢查這個條件。爲防止發生這種情況,請在提出100次請求之前,明確致電boto的connection.close。我們在長時間運行的過程中創建了數十萬個S3請求,並且在每次請求80次之後調用connection.close

+0

非常好的答案。 – Vor

+0

這並不回答我的問題,因爲它沒有解決錯誤,但這是非常有用的信息使用這個工具,所以我會接受它作爲答案。可以這麼說,真的很好地解釋了發生了什麼事情。 – Brad

+0

我正在使用boto3.client('s3'...我應該改變它嗎? – Serge