【问题标题】:Using boto3 to await a synchronous lambda invocation使用 boto3 等待同步 lambda 调用
【发布时间】:2022-01-31 16:17:32
【问题描述】:

我想同步调用一个 lambda 函数(请求 - 响应),但想使用 python async-await 来await 响应。

    response = await client.invoke('my-func', InvocationType='RequestResponse', Payload='...'))

我找到了一种解决方案here,但它很麻烦,而且从 2016 年开始。

今天有更好的方法吗?

【问题讨论】:

  • boto3 不支持异步。所以除非你把它放在一个单独的线程中,否则它会阻塞。
  • 您能描述一下您希望这样做吗?如果您希望调用是同步的(确实如此),则不需要await
  • @dirn 我认为这行代码几乎可以解释它。也许您将 python asyncio await 与 lambda 同步调用混淆了?它们使用相同的术语,但它们是在完全不同的层次上实现的完全不同的概念。
  • 但是你还没有解释那行代码应该做什么。等待同步操作是什么意思?如果不是与 asyncio 关联的 await,那是什么 await? asyncio 标签可能应该从问题中删除,因为它是不相关的。
  • boto3 不适用于 asyncio。为此,您需要使用 aioboto3。否则,您将需要使用来自concurrent.futuresThreadPoolExecutor

标签: python boto3 python-asyncio


【解决方案1】:

我找到了一种方法,方法是在 asyncio 事件循环上手动运行 invoke 函数:

import asyncio
import concurrent
import boto3
import json

import botocore


class LambdaClient():
    def __init__(self, concurrency: int = 20):
        self.executor = concurrent.futures.ThreadPoolExecutor(
            max_workers=concurrency,
        )
        client_config = botocore.config.Config(
           max_pool_connections=concurrency
        )
        self.client = boto3.client('lambda', config=client_config)
    
    async def invoke_async(self, snapshot):
        loop = asyncio.get_running_loop()
        result = await loop.run_in_executor(self.executor, lambda: self.invoke(snapshot))
        return result

    def invoke(self, snapshot):
        payload = {
        'path': '/calculate/value',
        'body': json.dumps(snapshot)
        }
        b = bytes(json.dumps(payload), encoding='utf8')
        response = self.client.invoke(
            FunctionName='function-name',
            InvocationType='RequestResponse',
            LogType='None',
            Payload=b)
        if 'StatusCode' not in response or response['StatusCode'] != 200:
            raise ValueError(f'Lambda invocation failed with response {response}')
        output = response["Payload"].read()
        return output

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多