python-3.x 如何在aws lambda中处理协程和常规函数

q3qa4bjr  于 2023-05-02  发布在  Python
关注(0)|答案(1)|浏览(107)

我正在API网关后面的AWS lambda函数中编写一个应用程序
一些函数可以是异步的(协同例程),而其他函数是常规函数
我如何在“主处理程序”中处理此问题

# here I'm mapping different paths / resources to different functions
main_router = {}
main_router.update(first_router)
main_router.update(second_router)


async def main(event):
    try:
        payload = {}
        resource = event['resource']
        payload['resource'] = resource
        payload['path'] = event['path']
        payload['method'] = event['httpMethod']
        body = event.get('body')
        query_params = event.get('queryStringParameters')
        if body:
            payload.update(body)
        if query_params:
            payload.update(query_params)

        if resource in main_router:
            return await main_router[resource](payload)
        return "not in main router"
    except Exception as e:
        return str(e)

def lambda_handler(event, _context):
    return asyncio.run(main(event))

如果该路径被定向到常规函数而不是异步函数则这失败,
我想要像

if regular_function:
         return main_router[resource](payload)
    if coroutine
         return await main_router[resource](payload)

lambda处理程序只需要

return asyncio.run(main(event))

这是一个路由器的示例

postmortems_router = {
    "/services": get_services,  # a regular function
    "/services/{proxy+}": get_specific_service, # an async def function
}

编辑:找到了一个从python端实现的方法:

import inspect

if inspect.iscoroutinefunction(main_router[resource]):
    return await main_router[resource](payload)
else:
    return main_router[resource](payload)

目前两者都运行得很好,lambda_handler只是

return asyncio.run(main())

我会更新后,如果我遇到任何问题,这一点

2uluyalo

2uluyalo1#

从python方面找到了一种方法:

import inspect

if inspect.iscoroutinefunction(main_router[resource]):
    return await main_router[resource](payload)
else:
    return main_router[resource](payload)

目前两者都运行得很好,lambda_handler只是

return asyncio.run(main())

相关问题