botocore:如何关闭或清理会话或客户端

时间:2015-11-01 11:56:12

标签: python botocore

在使用Python中的botocore库围绕AWS-EC2进行一些自动化时,我注意到仍然建立了许多HTTPS连接,这些连接不再需要忙着做其他事情的进程(因此要杀掉它们或重新编码)他们退出不是一个选择)。我认为botocore会话和/或客户端对象正在建立与AWS端点的连接。 botocore文档显示了如何启动或创建它们,但如何关闭它们或清理它们。我尝试了.close方法,但它不存在。 如何在不中断流程的情况下优雅地关闭这些连接?

1 个答案:

答案 0 :(得分:4)

我有同样的问题,但是从一个稍微不同的角度来看:当关闭工作线程时,我的日志文件会因为这些警告而混乱 - 也是由于打开连接:

  

在:< ssl.SSLSocket fd = 4,family = AddressFamily.AF_INET,type = 2049,proto = 6,laddr =(' [internal ip]',49266),raddr中忽略了异常=(' [external ip]',443)>

     

ResourceWarning:unclosed< ssl.SSLSocket fd = 4,family = AddressFamily.AF_INET,type = 2049,proto = 6,laddr =(' [internal ip]',49266),raddr = (' [external ip]',443)>

经过一段时间的兔子洞,我已经弄清楚如何在关闭线程之前正确关闭连接。

我将SQS与boto3一起使用,因此您可能需要稍微修改一下它才能使用botocore。

我上面发出警告的例子是:

import boto3
import boto3.session
import warnings

warnings.simplefilter('error', ResourceWarning)  # Display warnings
session = boto3.session.Session()
sqs = session.resource('sqs', region_name=AWSregion)
sqs_q = sqs.Queue(url=SQSQueueUrl)
sqs_msg = sqs_q.receive_messages(MaxNumberOfMessages=1)

可以使用以下方法关闭SQS连接:

sqs.meta.client._endpoint.http_session.close()  # closing a boto3 resource
sqs._endpoint.http_session.close()  # closing a boto3 client