本文介紹Python如何實現并應用函數實例生命周期回調方法。
背景信息
當您實現并配置函數實例生命周期回調后,函數計算將在相關實例生命周期事件發生時調用對應的回調程序。函數實例生命周期涉及Initializer、PreFreeze和PreStop三種回調。更多信息,請參見函數實例生命周期回調。
函數實例生命周期回調程序與正常調用請求計費規則一致,但其執行日志只能在函數日志、實例日志或高級日志中查詢,調用請求列表不會展示回調程序日志。具體操作,請參見查看實例生命周期回調函數日志。
Initializer回調
初始化回調程序(Initializer回調)在函數實例啟動成功后,請求處理程序(Handler)之前執行。函數計算保證在一個實例生命周期內,成功且只成功執行一次Initializer回調。如果您的Initializer回調第一次執行失敗,那么此次函數調用直接返回失敗,下次調用時,會再新建一個函數實例執行initializer回調。
Initializer回調只有一個context輸入參數,使用方法和事件請求處理程序一樣。
一個最簡單的Initializer方法定義如下所示。
def initialize(context):
print("initialize invoked")
initialize
是Initializer回調方法名,需要與您在函數計算控制臺配置的Initializer回調程序一致。例如,您為函數配置的Initializer回調程序為index.initialize
,那么函數計算在配置Initializer屬性后會去加載index.py
中定義的initialize
方法。
方法簽名
- 輸入參數只有
context
,為您的FC函數調用提供在調用時的運行上下文信息。 - 無返回值。
PreFreeze回調
預凍結回調程序(PreFreeze回調)在函數實例凍結前執行,方法簽名同Initializer回調。
一個簡單的PreFreeze方法定義如下所示。
def preFreeze(context):
print("preFreeze invoked")
PreStop回調
預停止回調程序(PreStop回調)在函數實例銷毀前執行,方法簽名同Initializer回調。
一個最簡單的PreStop方法定義如下所示。
def preStop(context):
print("preStop invoked")
配置生命周期回調函數
通過控制臺配置
您可以登錄函數計算控制臺,為函數配置Initializer 回調程序、PreFreeze 回調程序和PreStop 回調程序。具體操作步驟,請參見函數實例生命周期。
回調程序的格式為[文件名.方法名]
。例如,Initializer 回調程序設置為index.initialize
,表示index.py
文件中的initialize
方法。
通過Serverless Devs工具配置
s.yaml
配置文件中添加初始化回調配置和PreStop回調配置。- 初始化回調配置
在function配置下添加initializer和initializationTimeout兩個字段。
- PreStop回調配置
在function配置下添加instanceLifecycleConfig.preStop字段,包括handler和timeout兩個字段。
具體的示例如下所示。
edition: 1.0.0 # 命令行YAML規范版本,遵循語義化版本(Semantic Versioning)規范
name: hello-world # 項目名稱
access: default # 密鑰別名
services:
fc-deploy-test: # 模塊名稱
component: devsapp/fc # 組件名稱
props: # 組件的屬性值
region: cn-hangzhou # 地域
service: # 服務配置
name: fc-deploy-service # service名稱
description: dem component # Service的簡短描述
function: # 函數配置
name: fc-base-service # function名稱
description: 'this is test' # function的簡短描述
codeUri: './code' # 代碼位置
handler: 'index.handler' # function執行的入口,具體格式和語言相關
memorySize: 128 # function的內存規格
runtime: python3 # 運行時
timeout: 60 # function運行的超時時間
initializationTimeout: 20 # 初始化方法超時時間
initializer: index.my_initializer # 初始化方法
instanceLifecycleConfig: # 擴展函數
preStop: # PreStop 函數
handler: index.preStop # 函數入口
timeout: 60 # 超時時間
關于Serverless Devs的YAML配置規范,請參見Serverless Devs操作命令。
查看實例生命周期回調函數日志
您可以通過函數日志功能查看回調函數日志。
- 登錄函數計算控制臺,在左側導航欄,單擊服務及函數。
- 在頂部菜單欄,選擇地域,然后在服務列表頁面,單擊目標服務。
- 在函數管理頁面,單擊目標函數名稱,然后在函數詳情頁面,單擊測試函數頁簽。
- 在測試函數頁簽,單擊測試函數,然后選擇 。在函數日志頁簽,您可以查看函數的調用日志、Initializer回調日志和PreFreeze回調日志,示例如下。
2022-10-09 19:26:17 FunctionCompute dotnetcore3.1 runtime inited. 2022-10-09 19:26:17 FC Initialize Start RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e****** 2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] Initialize start 2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] Handle initializer: 793ad2f1-9826-4d9a-90d9-5bf39e****** 2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] Initialize end 2022-10-09 19:26:17 FC Initialize End RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e****** 2022-10-09 19:26:17 FC Invoke Start RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e****** 2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] Handle request: 793ad2f1-9826-4d9a-90d9-5bf39e****** 2022-10-09 19:26:17 FC Invoke End RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e****** 2022-10-09 19:26:17 FC PreFreeze Start RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e****** 2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] PreFreeze start 2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] Handle PreFreeze: 793ad2f1-9826-4d9a-90d9-5bf39e****** 2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] PreFreeze end 2022-10-09 19:26:17 FC PreFreeze End RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e******
因為每個函數實例會緩存一段時間,不會馬上銷毀,因此不能立即查看PreStop回調日志。如需快速觸發PreStop回調,可更新函數配置或者函數代碼。更新完成后,再次查看函數日志,您可以查看PreStop回調日志。示例如下。2022-10-09 19:32:17 FC PreStop Start RequestId: 03be685c-378b-4736-8b08-a67c1d***** 2022-10-09 19:32:17 2022-10-09 19:32:17 03be685c-378b-4736-8b08-a67c1d***** [INFO] PreStop start 2022-10-09 19:32:17 2022-10-09 19:32:17 03be685c-378b-4736-8b08-a67c1d***** [INFO] Handle PreStop: 03be685c-378b-4736-8b08-a67c1d***** 2022-10-09 19:32:17 2022-10-09 19:32:17 03be685c-378b-4736-8b08-a67c1d***** [INFO] PreStop end 2022-10-09 19:32:17 FC PreStop End RequestId: 03be685c-378b-4736-8b08-a67c1d*****
示例程序
函數計算為您提供了使用Initializer回調和PreStop回調的MySQL示例程序。在本示例中,Initializer回調函數用于從環境變量中獲取MySQL數據庫配置,創建MySQL連接并測試連通性,PreStop回調函數負責關閉MySQL連接。
詳細信息,請參見python3-mysql。