2014-09-23 78 views
1

如何清除/關閉/重新使用使用boto連接到S3存儲桶的套接字?使用boto從S3中獲取時TCP套接字未關閉

This discussion從2010年說這是一個問題httplib.HTTPSConnection而不是boto。在我的代碼中,我使用key.close(fast=True)來獲得從boto.s3.bucket.Bucket.list()獲得的所有密鑰。每次我使用一個密鑰來引用文件,博託打開一個獨特的插座,過了一段時間,我會得到[Errno 24]: Too many open files

當我運行lsof | grep python我得到這些不同的:

python 10573 ec2-user 399u  IPv4 59221  0t0 TCP ip-10-0-0-113.ec2.internal:59293->s3-1-w.amazonaws.com:https (CLOSE_WAIT) 
python 10573 ec2-user 72u  IPv4 60910  0t0 TCP ip-10-0-0-113.ec2.internal:37952->s3-1-w.amazonaws.com:https (ESTABLISHED) 
python 10573 ec2-user 91u  sock 0,6  0t0 61105 can't identify protocol 

這些連接類型(IPv4的插座,插座),TCP節點和名稱(最後一欄)是本地主機:端口 - > TCP遠程地址(TCP/TPI的狀態)。

ulimit -a表示打開的文件最大爲1024,而一個選項只是提高最大值。但是,我想確保我正在關閉我應該是的文件。

我認爲製作和重複使用1個插座更聰明,boto可以嗎?

回答

1

我漏水文件描述符:(

博託鍵是可迭代的,所以你應該從流式傳輸的數據是,僅使用原裝博託製造插座(即忽略它,讓博託做所有的工作爲你):

for data in key: 
    # etc