2014-09-23 37 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