【问题标题】:Serverless Framework: Invoke local python function is slow to respond无服务器框架:调用本地 python 函数响应缓慢
【发布时间】:2019-03-25 15:41:36
【问题描述】:

尝试使用以下方法在本地运行我的无服务器 python lambda 函数:

无服务器调用本地 -f hello

函数运行,但在调用处理程序之前似乎需要 2-5 秒。这对我来说是一个真正的问题,因为我希望使用invoke 来支持本地测试。

我的处理程序超级简单:

def hello(event, context):
   print('start')
   body = {
      "message": "Go Serverless v1.0! Your function executed successfully!",
      "input": event
   }

   response = {
      "statusCode": 200,
     "body": json.dumps(body)
   }
   print('end')

   return response

大致时间:

  • 调用invokeprint(start):2-5s
  • print(start)print(end)
  • print(end) 回复终端:1s

由于我找不到任何其他人遇到此问题,建议它与我的本地计算机有关。不知道它可能是什么,甚至不知道从哪里开始查找故障。

无服务器:1.32(全局安装) Python:3.6.5

【问题讨论】:

  • 您可以尝试使用 pyflame 来分析您的命令的执行情况,看看它在哪里花费的时间最多。 github.com/uber/pyflame

标签: python-3.x serverless-framework


【解决方案1】:

这是无服务器框架的问题(可悲的是 AWS SAM 框架),而不是您的代码。不幸的是,Node.JS 和 Go 本地调用遇到了同样的问题。

问题源于,不是代码的执行,而是在每次调用时,都需要重新配置执行环境,并且所需的时间取决于机器。

调用的另一种方法是,正如我所做的那样,在您的 lambda 处理程序上编写一个 API HTTP Server 包装器。在本地环境中,您可以使用包装器启动服务器并继续测试。

编辑:

这基本上是创建包装器所需要做的:

  1. 从包装器中启动 HTTP 服务器。
  2. 创建一个函数,将您在服务器上的请求转换为 Lambda 请求,并将您的 lambda 处理程序返回的响应转换为您的 HTTP Server 响应。
  3. 在您的包装器上,创建与serverless.yml 中提到的路径相对应的路径端点。使用第 2 步中创建的函数将请求转发给您的处理程序。
  4. 从您的处理程序接收返回的结果后,将其映射到您的 HTTP 服务器响应并将其作为响应发送给用户。

【讨论】:

  • 我的包装器用于 GoLang,而不是用于 python。不过,我将通过一些指导方针来更新答案。
  • 已更新指南。
猜你喜欢
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2016-02-18
  • 2011-07-01
  • 2017-10-05
  • 1970-01-01
相关资源
最近更新 更多