【问题标题】:How to close connection available out of handle?如何关闭无法处理的连接?
【发布时间】:2019-09-21 00:41:28
【问题描述】:

我在 Python 中为 AWS 构建了一个 lambda 函数,它使用 aiohttp 发出一些请求。

如 AWS documentation 所述,

您的 Lambda 函数代码(处理程序代码之外,请参阅编程模型)中的任何声明都保持初始化状态,从而在再次调用函数时提供额外的优化。例如,如果您的 Lambda 函数建立了数据库连接,而不是重新建立连接,则在后续调用中使用原始连接。

所以我把 aiohttp.ClientSession() 放在了句柄函数之外,所以它可能会被未来的 lambda 函数重用:

http_session = None

def handle(event, context):
    global http_session

    # http_session will be not None if context is reused
    if http_session is None:
        http_session = aiohttp.ClientSession()

    # [...] Use http_session here

但是,我必须在不再使用await session.close() 之后关闭与它的连接,也就是说,当上下文被丢弃时。我不能在handle 中关闭http_session,因为这将完全消除连接被重用的可能性。

考虑到这一点,我有什么选择?

  1. 只要让连接打开,它就会在某个时候自行关闭。
  2. 有一种方法可以在上下文删除时执行特定代码。
  3. 没有办法做我想做的事。

谢谢,提前。

【问题讨论】:

  • 你是对的。如果你关闭它,它就不再是持久连接了。我从未听说过上下文挂钩。保持连接打开是非常安全的。如果一段时间后未使用,服务器将关闭连接。连接关闭的时间(保持活动超时)在服务器端配置。每个服务器的默认值都不同。例如。对于 Apache,它只有 5-10 秒。
  • 好吧,如果让连接打开没有真正的问题,我认为这是要走的路。您能否给出答案,以便我接受它作为正确答案?

标签: python amazon-web-services aws-lambda


【解决方案1】:

但是,在不再使用它之后,我必须使用 await session.close() 关闭连接,也就是说,当上下文被丢弃时。我无法在句柄中关闭 http_session,因为它会完全取消连接被重用的可能性。

是的,没错。如果你关闭它,它就不再是持久连接了。

  1. 有一种方法可以在上下文删除时执行特定代码。

我从未听说过上下文删除挂钩。在 aws 文档中也没有找到类似的内容。

  1. 只要让连接打开,它就会在某个时候自行关闭。

这就是我公司现在的处理方式以及我在互联网上找到的大多数示例。保持连接打开是非常安全的。如果一段时间后未使用,服务器将关闭连接。连接关闭的时间(保持活动超时)在服务器端配置。每个服务器的默认值都不同。例如。对于 apache 来说只有 5-10 秒。

【讨论】:

    猜你喜欢
    • 2011-09-27
    • 2019-08-16
    • 2017-05-30
    • 2020-10-28
    • 1970-01-01
    • 2019-07-25
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多