我有一个Python 3.6 Lambda函数,需要将依赖项下载到/ tmp中(我也使用图层,但由于大小限制,需要/ tmp)并导入它们。我有在处理程序之前执行临时下载,压缩和提取临时代码的代码,期望它仅在冷启动时才需要下载。说出来像下面的样子(伪代码):
log('Cold start')
download_deps() # has some log statements of its own
log('init end')
def handler(event, context):
...
大部分时间它都可以正常工作。但是,在初始化期间,日志有时会不复出现。 (例如,它说“冷启动”,而不是“初始化结束”;它“死”在download_deps中的某个位置)。我在那里有异常处理并记录了所有内容,但没有任何显示。当处理程序下次运行时,它将运行到ImportError中。
在尝试解决此问题时,我注意到了一些奇怪的地方。一次调用Lambda时,初始化代码运行两次。给定以上伪代码,日志如下所示:
Cold start
<logs from download_deps that indicate it downloaded things into /tmp>
START <RequestId> ...
<RequestId> Cold start
<logs from download_deps that indicate it skipped download because /tmp was already populated by deps>
init end
END <RequestId>
“ init end”部分没有第一次出现,因此日志以某种方式再次消失。由于它第二次跳过下载(/ tmp被保留),我知道这不是2次实际的冷启动发生。第二次记录“冷启动”时,它包括RequestId,但第一次没有。即使API网关上的请求的时间与第一个“冷启动”的时间相匹配,几乎也就好像第一次初始化不是由请求引起的。这是怎么回事?
答案 0 :(得分:0)
我注意到两个“冷启动”总是相隔约10秒。看起来,如果初始化代码花费了约10秒以上的时间,它将重新启动。此外,根据日志中报告的持续时间,第二次初始化所花费的时间也包含在计费持续时间中。
为解决我的问题,我将download_deps()移到了处理程序中,确保仅在需要时才执行任何操作。