给出响应后如何继续执行函数?

时间:2021-03-30 20:24:03

标签: python amazon-web-services python-3.7 yandexcloud

我有以下示例代码。这是作为 Yandex.Functions 运行的(几乎等同于 AWS 函数)。

def handler(event, context):
    # some long processing is here
    text = result_of_long_processing()
    return {
        'response': {
            'text': text
        },
    }

我应该按照以下方式修改代码:

  1. 如果 long processing 花费的时间少于 3 秒,则应返回此处理的结果
  2. 如果超过 3 秒,则应返回一些标准文本(如 wait more)并继续处理。

我怎样才能实现它?

1 个答案:

答案 0 :(得分:2)

<块引用>

这是作为 Yandex.Functions 运行的(几乎等同于 AWS 函数)。

我将根据这个来回答,简短的回答是你不能。

Lambda 函数在执行结束时返回一些值。一旦你返回它就不会继续执行。虽然您可以创建一个后台线程,但当主线程返回一个值时,该线程将被挂起。

这意味着您需要创建一个系统架构来支持长时间运行的任务。至少涉及:

  • 两个 Lambda,一个执行处理,一个与调用者交互。
  • 一些存储结果的地方,例如 Redis 缓存或数据库。

在这样的系统中,您的“网关”功能会创建一个唯一标识符(通常是 UUID)。然后调用第二个“处理”函数,将 UUID 传递给它。

处理函数完成它的工作,并将结果写入数据存储区,以 UUID 为键。

“网关”函数可以立即将该 UUID 返回给调用者,或者选择等待(轮询数据存储)您想要等待的时间。

如果“网关”完成轮询时结果不可用,则客户端必须承担责任:使用 UUID 调用“网关”,直到结果可用。