【问题标题】:AWS Lambda: does it matter if handlers are sync vs async, w.r.t. concurrent calls?AWS Lambda:处理程序是同步还是异步是否重要,w.r.t.并发通话?
【发布时间】:2021-03-20 04:14:29
【问题描述】:

对于 AWS Lambda 处理程序,代码是异步还是同步(例如 async defdef)对于多次调用该 Lambda 函数的并发性能是否重要?也就是说,如果我编写一个同步函数,由于 AWS 内部处理来自单独调用的 Lambda 调用的方式,该函数是否会被“异步”调用?还是该函数会开始处理 UserA,并将 UserB 的请求排队,直到完成 UserA?

背景故事:我正在编写一些 Python + SQLAlchemy Lambda 函数。 SQLAlchemy 1.4 刚刚发布了对 asyncio 的支持,但对我来说会有一些重写开销。我想知道我是否可以在 Lambda 上编写不考虑并发性的传统同步 Python 代码(对于自定义 Flask / FastAPI 代码,我肯定需要考虑并发性)。

【问题讨论】:

  • Lambda 是否支持使用async def 定义的处理程序?

标签: aws-lambda python-asyncio


【解决方案1】:

如果您有多个请求同时调用 lambda,则服务将尝试运行 lambda 的多个实例。由于 lambda 本身或帐户的并发限制,您可能会遇到限制。 Lambda 不会对同一 lambda 函数的请求进行排队。一个函数一次从不处理多个请求。即使在系统提供队列机制来处理请求的情况下,它们也不是线程队列,就像您在服务器中可能拥有的那样。它们实际上只是一次通过一个请求调用 lambda 的内部 SQS 队列。

【讨论】:

  • 知道了。因此,即使我将函数设为异步,也不意味着 Lambda 实例将处理并发调用。每个调用都是它自己的 Lambda 调用?
  • 没错。在 lambda 函数的情况下,异步并没有真正为您做很多事情。如果您碰巧在做多线程的事情,并且您正在发出 I/O 请求,那么可能会有一些好处,但我认为这种情况很少见。
  • 我是否正确地假设,JVM lambdas 可以给出相同的答案?
  • 在线程池(在 JVM 上)上使用反应流的用例怎么样。在这种情况下,异步 IO 对 AWS lambda 有帮助吗?
  • 如果您在同一个请求中一次发出多个,则对 IO 的异步调用可能会很有利。例如,如果您需要根据请求调用几个 HTTP 端点,您可以异步进行这些端点,并等待两者都返回后再继续,而不是同步调用每个端点并一次等待网络一个。至于 Java 是如何处理的,我真的不知道,但它与任何其他 Java 代码相同。请注意,您很可能使用单核。
猜你喜欢
  • 1970-01-01
  • 2021-03-17
  • 2018-05-31
  • 2019-01-17
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多