如何关闭无法使用的连接?

时间:2019-05-02 13:15:28

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

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

如AWS documentation所述,

  

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

所以我将aiohttp.ClientSession()放在了handle函数之外,因此将来的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()时(即上下文被丢弃时),我必须关闭该连接。我无法在http_session中关闭handle,因为这将完全消除连接被重用的可能性。

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

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

谢谢。

1 个答案:

答案 0 :(得分:1)

  

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

是的,没错。如果您将其关闭,则不再是持久连接。

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

我从没听说过上下文放置挂钩。在AWS文档中也找不到类似的东西。

  
      
  1. 简单地打开连接,它会在某个时候自行关闭。
  2.   

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