Amazon web services 如果在lambda函数中未取消超时处理程序,会发生什么情况?

Amazon web services 如果在lambda函数中未取消超时处理程序,会发生什么情况?,amazon-web-services,aws-lambda,Amazon Web Services,Aws Lambda,我有一个lambda函数,它在开始时将超时处理程序设置为一定的延迟(60秒)。 我想知道当超时处理程序在lambda返回响应之前(不到60秒)不被取消时,lambda的确切行为是什么。特别是,当有数百个lambda调用时,前一个lambda执行中未取消的超时处理程序是否会影响在同一实例上运行的下一个进程?更多信息-lambda函数是异步调用的。您没有提到正在使用哪种语言,也没有提供任何指示如何创建超时的代码,但在中介绍了一般过程 Lambda在调用后冻结执行环境,并在某一最长时间内(15分钟后)

我有一个lambda函数,它在开始时将超时处理程序设置为一定的延迟(60秒)。
我想知道当超时处理程序在lambda返回响应之前(不到60秒)不被取消时,lambda的确切行为是什么。特别是,当有数百个lambda调用时,前一个lambda执行中未取消的超时处理程序是否会影响在同一实例上运行的下一个进程?更多信息-lambda函数是异步调用的。

您没有提到正在使用哪种语言,也没有提供任何指示如何创建超时的代码,但在中介绍了一般过程

Lambda在调用后冻结执行环境,并在某一最长时间内(15分钟后)保持冻结状态,如果新调用发生得足够快,则会解冻,并重新使用先前的执行环境

文档中的关键引用是:

如果Lambda重用执行环境,则由Lambda函数启动且函数结束时未完成的后台进程或回调[将]恢复。确保在代码退出之前,代码中的任何后台进程或回调都已完成


您没有提到正在使用哪种语言,也没有提供任何指示如何创建超时的代码,但在中描述了一般过程

Lambda在调用后冻结执行环境,并在某一最长时间内(15分钟后)保持冻结状态,如果新调用发生得足够快,则会解冻,并重新使用先前的执行环境

文档中的关键引用是:

如果Lambda重用执行环境,则由Lambda函数启动且函数结束时未完成的后台进程或回调[将]恢复。确保在代码退出之前,代码中的任何后台进程或回调都已完成


正如您在评论中所写,lambda是用python编写的。 此简单示例显示事件正在传递到下一次调用:

守则:

import json
import signal 
import random

def delayed(val):
    print("Delayed:", val)

def lambda_handler(event, context):
    r = random.random()
    print("Generated", r)
    signal.signal(signal.SIGALRM, lambda *args: delayed(r))
    signal.setitimer(signal.ITIMER_REAL, 1)
    return {'statusCode': 200}
收益率:

想想AWS实现lambdas的方式: 调用lambda时,将引发容器,环境开始初始化(这是
冷启动
阶段)。 在初始化过程中,python解释器将启动,在幕后,AWS代码从lambda服务获取事件并触发处理程序。 这种初始化代价高昂,因此AWS更愿意使用相同的“进程”等待下一个事件。在happy flow上,它在上一次完成后“足够快”到达,因此他们省去了初始化,每个人都很高兴。 否则,在一小段时间后,他们将关闭容器。 只要解释器仍然打开,我们在一次调用中触发的信号就会泄漏到下一次调用


还要注意lambda的并发性-两个并行运行的调用在不同的容器上运行,因此具有不同的解释器,并且此警报不会泄漏。

正如您在注释中所写,lambda是用python编写的。 此简单示例显示事件正在传递到下一次调用:

守则:

import json
import signal 
import random

def delayed(val):
    print("Delayed:", val)

def lambda_handler(event, context):
    r = random.random()
    print("Generated", r)
    signal.signal(signal.SIGALRM, lambda *args: delayed(r))
    signal.setitimer(signal.ITIMER_REAL, 1)
    return {'statusCode': 200}
收益率:

想想AWS实现lambdas的方式: 调用lambda时,将引发容器,环境开始初始化(这是
冷启动
阶段)。 在初始化过程中,python解释器将启动,在幕后,AWS代码从lambda服务获取事件并触发处理程序。 这种初始化代价高昂,因此AWS更愿意使用相同的“进程”等待下一个事件。在happy flow上,它在上一次完成后“足够快”到达,因此他们省去了初始化,每个人都很高兴。 否则,在一小段时间后,他们将关闭容器。 只要解释器仍然打开,我们在一次调用中触发的信号就会泄漏到下一次调用


还要注意lambdas的并发性-两个并行运行的调用在不同的容器上运行,因此具有不同的解释器,并且此警报不会泄漏。

我认为语言在这里不是问题,但您的答案是有意义的。谢谢不客气。那个文档页读得很好。我希望指出的一点是,如果没有实际的代码,我们无法确定这个超时处理程序是什么,因此我们无法确定它的行为。如果这是C++,表示超时处理程序的对象超出了范围,那么它的析构函数可能取消超时。显然,这是一个不太可能的场景,并且几乎肯定与您的案例无关,但是最好知道我们正在处理什么(例如JavaScript和setTimeout)。总之,没什么大不了的。是的,lambda代码是用Python编写的。再次感谢您的解释!我认为语言不是问题,但你的回答很有道理。谢谢不客气。那个文档页读得很好。我希望指出的一点是,如果没有实际的代码,我们无法确定这个超时处理程序是什么,因此我们无法确定它的行为。如果这是C++,表示超时处理程序的对象超出了范围,那么它的析构函数可能取消超时。显然,这是一个不太可能的场景,并且几乎肯定与您的案例无关,但是最好知道我们正在处理什么(例如JavaScript和setTimeout)。总之,没什么大不了的。是的,lambda代码是用Python编写的。再次感谢您的解释!