【问题标题】:botocore: how to close or clean up a session or clientbotocore:如何关闭或清理会话或客户端
【发布时间】:2017-09-12 16:28:39
【问题描述】:

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

【问题讨论】:

    标签: python botocore


    【解决方案1】:

    我遇到了同样的问题,但角度略有不同:关闭工作线程时,我的日志文件会被这些警告弄得一团糟——也是由于打开的连接:

    在以下位置忽略了异常:

    ResourceWarning: 未关闭

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

    我将 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
    

    【讨论】:

    • 这仍然是关闭套接字的推荐方法吗? _endpoint 是私有属性
    • @AaronLelevier 显然没有真正的解决方案,但是警告是误报。见:github.com/boto/boto3/issues/454
    • 这对我不起作用 boto3 == 1.20.52 for s3 http_session 是一个没有关闭方法的 URLib3 资源
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 2014-02-20
    相关资源
    最近更新 更多