本文介紹Python如何實現并應用函數實例生命周期回調方法。

背景信息

當您實現并配置函數實例生命周期回調后,函數計算將在相關實例生命周期事件發生時調用對應的回調程序。函數實例生命周期涉及Initializer、PreFreeze和PreStop三種回調。更多信息,請參見函數實例生命周期回調

函數實例生命周期回調程序與正常調用請求計費規則一致,但其執行日志只能在函數日志實例日志高級日志中查詢,調用請求列表不會展示回調程序日志。具體操作,請參見查看實例生命周期回調函數日志

說明 Python 2.7及其以前的版本不支持配置PreFreeze回調。

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方法。

shengmingzhouqi

通過Serverless Devs工具配置

如果使用Serverless Devs工具,需要在s.yaml配置文件中添加初始化回調配置和PreStop回調配置。
  • 初始化回調配置

    function配置下添加initializerinitializationTimeout兩個字段。

  • PreStop回調配置

    function配置下添加instanceLifecycleConfig.preStop字段,包括handlertimeout兩個字段。

具體的示例如下所示。

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操作命令

查看實例生命周期回調函數日志

您可以通過函數日志功能查看回調函數日志。

  1. 登錄函數計算控制臺,在左側導航欄,單擊服務及函數
  2. 在頂部菜單欄,選擇地域,然后在服務列表頁面,單擊目標服務。
  3. 函數管理頁面,單擊目標函數名稱,然后在函數詳情頁面,單擊測試函數頁簽。
  4. 測試函數頁簽,單擊測試函數,然后選擇調用日志 > 函數日志
    函數日志頁簽,您可以查看函數的調用日志、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