编写用于AWS Lambda的异步代码的正确方法是什么?

man*_*xxl 5 python amazon-web-services python-3.x python-asyncio aws-lambda

我写了以下代码:


import asyncio

loop = asyncio.get_event_loop()

async def get_urls(event):

    return {'msg':'Hello World'}

def lambda_handler(event,context):

    return loop.run_until_complete(get_urls(event))
Run Code Online (Sandbox Code Playgroud)

我试图完成以下步骤,但速度更快。


def lambda_handler(event, context):
    # TODO implement
    return {'msg':'Hello World'}
Run Code Online (Sandbox Code Playgroud)

在AWS Lambda环境中编写此代码的正确方法是什么?

Mes*_*ssa 12

对我有用...您需要选择运行时“Python 3.6”或“Python 3.7”。

import asyncio

loop = asyncio.get_event_loop()

async def get_urls(event):
    return {'msg':'Hello World'}

def lambda_handler(event, context):
    return loop.run_until_complete(get_urls(event))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • @givo 是的。Python 在导入期间执行任何“外部代码”(最左侧级别的代码,任何函数或类之外的代码)。另一种选择是使用全局变量来保存连接,并仅在尚未初始化时才在处理函数中对其进行初始化。 (2认同)

Gee*_*ogi 5

对于 Python 3.7+,您可以使用asyncio.run()它来执行协程:

import asyncio

# The AWS Lambda handler
def handler(event, context):
    asyncio.run(main())

async def main():
    # Here you can await any awaitable
    await asyncio.sleep(1)
    await asyncio.gather([coroutine_1, coroutine_2])
Run Code Online (Sandbox Code Playgroud)

以下是如何在 AWS Lambda 上使用 asyncio、aiohttp 和 aiobotocore 开发、测试和部署异步 Python 函数的完整示例:https: //github.com/geeogi/async-python-lambda-template

  • 我认为这是错误的,至少如果您在 Lambda 调用中重用全局资源的话。当我使用 `asyncio.run` 时,我在后续运行中收到“事件循环关闭”错误。我想这是因为那些全局资源与之前的事件循环相关联? (2认同)

All*_*ter 4

异步执行同时做很多事情。你只做一件事。你做一件事的速度不可能比做一件事所需的时间还要快。异步执行允许您执行通常会同时执行一个又一个(同步)的独立任务,然后返回所有任务的结果。本质上,您必须执行不止一项操作。

  • 您是对的,但在某些情况下您可以从 AWS lambda 中的异步中受益。例如,当您的函数聚合来自多个 HTTP 端点的结果时。 (9认同)