【问题标题】:AWS lambda with python asyncio. Event loop closed problem?AWS lambda 与 python asyncio。事件循环关闭问题?
【发布时间】:2022-01-05 23:39:57
【问题描述】:

关闭 aws lambda 中的事件循环会影响未来的 lambda 运行??

  • 我在 aws lambda 服务中运行了一些 aysncio python 代码。代码逻辑如下

    def lambda_handler(event,context):
        loop = asyncio.get_event_loop()
        # perform all operations with the loop
        loop.close()
        return results
    
  • 如果我运行一次,它似乎工作正常。但是,如果我之后立即重新运行它,我会收到一条错误消息,提示 Event loop closed

  • 为什么会这样?每个 lambda 运行不应该独立于最后一个吗?毕竟 lambda 应该是 stateless

【问题讨论】:

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


    【解决方案1】:

    Python 3.7+

    您可以使用更高级别的asyncio.run() 来处理事情。

    def handler(event, context):
        asyncio.run(main())
    
    async def main():
        # your async code here
    

    这将在最后关闭循环并在再次运行 lambda 时打开一个新循环。 .run() 也是 asyncio 维护者推荐的。

    【讨论】:

    • 好答案。虽然,不幸的是我使用的是 python 3.6 - asyncio.run() 直到 python 3.7 才可用
    • @ArranDuff 确实如此。我编辑我的答案以反映这一点。
    【解决方案2】:

    毕竟 lambda 应该是无状态的

    你的函数应该是无状态的。

    来自https://aws.amazon.com/lambda/faqs/

    问:什么是 AWS Lambda 函数?

    ...

    代码必须以“无状态”风格编写,即它应该假定与底层计算基础设施没有关联。

    ...

    问:AWS Lambda 会复用函数实例吗?

    为了提高性能,AWS Lambda 可能会选择保留您的函数实例并重新使用它来处理后续请求,而不是创建新副本。要了解有关 Lambda 如何重用函数实例的更多信息,请访问我们的文档。您的代码不应假定这种情况总是会发生。

    当前的 python 实例出于性能原因被重用,但绝不能依赖它的重用或非重用。因此,虽然 AWS Lambda 本身并不总是无状态的,但您的编程方法应该是。希望这能消除您对为什么会发生这种情况的困惑!

    【讨论】:

      【解决方案3】:

      在代码的顶部添加这一行,

      asyncio.set_event_loop(asyncio.new_event_loop())

      所以它是全球性的。

      或者,

      替换,

      loop = asyncio.get_event_loop()

      与,

      loop = asyncio.new_event_loop()

      它正在发生,因为您已经关闭了循环。

      应该可以的。

      【讨论】:

      • 这在 Python 3.6 上对我有用。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      • 1970-01-01
      • 2018-10-22
      • 1970-01-01
      • 2014-06-10
      相关资源
      最近更新 更多