Bir işlev örneği başlatıldığında veya kapatıldığında özel mantık çalıştırmanız gerekebilir; örneğin ilk istek gelmeden önce bir veritabanı bağlantısı açmak veya örnek yok edilmeden önce kaynakları düzgün bir şekilde serbest bırakmak. Yaşam döngüsü kanca işlevleri, Function Compute'un bir işlev örneğinin yaşamındaki bu iki noktada otomatik olarak çağıracağı Python işlevlerini kaydetmenize olanak tanır.
Python çalışma zamanları için iki tür kanca işlevi kullanılabilir:
Initializer hook — Bir örnek başladıktan sonra, işleyici herhangi bir isteği işlemeye başlamadan önce bir kez çalışır.
PreStop hook — Bir örnek yok edilmeden önce çalışır ve kaynakları serbest bırakmanız için size zaman tanır.
Yaşam döngüsü kanca işlevlerinin çalışma biçimi
Bir işlev örneği üç aşamadan geçer:
| Aşama | Çalışma Zamanı | Kanca İşlevi |
|---|---|---|
| Init (Başlatma) | Örnek başladığında | Initializer hook (yapılandırıldıysa) |
| Invoke (Çağrı) | İşleyici istekleri işlerken | — |
| Shutdown (Kapatma) | Örnek yok edildiğinde | PreStop hook (yapılandırıldıysa) |
Yaşam döngüsü kanca işlevlerinin çalıştırılması normal çağrılarla aynı oran üzerinden faturalandırılır. Günlükler Function Logs, Real-time Logs ve Advanced Logs bölümlerinde görüntülenir ancak çağrı istek listesinde yer almaz.
Initializer hook
Initializer hook her örnek için bir kez çalışır; örnek başladıktan sonra ancak ilk işleyici çağrısından önce yürütülür. Function Compute örnek başına tam olarak bir kez çalıştırılmasını garanti eder.
Hata davranışı: Kanca işlevi başarısız olursa çağrı bir hata döndürür. Sonraki çağrıda Function Compute yeni bir örnek oluşturur ve Initializer hook'u yeniden çalıştırır.
Yöntem imzası:
| Parametre | Açıklama |
|---|---|
context |
Geçerli çağrı için çalışma zamanı meta verilerini sağlar. |
| Dönüş değeri | Yok. |
Örnek: Veritabanı bağlantısını başlatma
Yaygın bir desen paylaşılan kaynakların Initializer hook içinde açılmasıdır; böylece her işleyici çağrısı bu kaynakları yeniden kullanır ve her istekte yeniden bağlantı kurulmasına gerek kalmaz.
import os
import pymysql
db_connection = None
def initialize(context):
global db_connection
host = os.environ.get("DB_HOST")
user = os.environ.get("DB_USER")
password = os.environ.get("DB_PASSWORD")
database = os.environ.get("DB_NAME")
db_connection = pymysql.connect(
host=host,
user=user,
password=password,
database=database,
)
print("Database connection established")
Yöntem adı (bu örnekte initialize) yapılandırdığınız Initializer Hook değeriyle eşleşmelidir. Örneğin Initializer Hook değerini index.initialize olarak ayarlamak Function Compute'a index.py dosyasındaki initialize yöntemini çağırması gerektiğini bildirir.
PreStop hook
PreStop hook bir işlev örneği yok edilmeden önce çalışır. Yöntem imzası Initializer hook ile aynıdır: Tek bir context parametresi bulunur ve dönüş değeri yoktur.
Örnek: Veritabanı bağlantısını kapatma
def preStop(context):
global db_connection
if db_connection:
db_connection.close()
print("Database connection closed")
İşlev örnekleri önbelleğe alınır ve son çağrıdan hemen sonra yok edilmez. Bu nedenle PreStop günlükleri hemen görünmeyebilir. Test amacıyla bir PreStop hook'unu hızlıca tetiklemek için işlevin yapılandırmasını veya kodunu güncelleyin; bu işlem mevcut örnekleri geri dönüştürür. Ardından PreStop günlüklerini Function Logs bölümünde görüntüleyebilirsiniz.
Yaşam döngüsü kanca işlevlerini yapılandırma
Function Compute konsolunu kullanma
Function Compute konsoluna giriş yapın. Sol gezinme bölmesinde Functions öğesine tıklayın.
Yapılandırmak istediğiniz işlevi seçin.
İşlev ayarlarında Initializer Hook ve PreStop Hook alanlarını
<filename>.<method>biçimini kullanarak ayarlayın; örneğinindex.initializeveyaindex.preStop.
Ayrıntılı adımlar için bkz. Örnek yaşam döngülerini yapılandırma.

Serverless Devs kullanma
s.yaml dosyasındaki işlev kaynağı altına instanceLifecycleConfig ekleyin. Her iki kanca işlevi de bir handler (<filename>.<method> biçiminde) ve bir timeout (saniye cinsinden) gerektirir.
edition: 3.0.0
name: fcDeployApp
access: "default"
vars: # The global variables
region: "cn-hangzhou"
resources:
hello_world:
component: fc3 # The name of the component
props:
region: ${vars.region}
functionName: "emojipy"
description: 'this is emoji'
runtime: "python3"
code: ./
handler: index.handler
memorySize: 128
timeout: 30
environmentVariables:
PYTHONPATH: /code:/code/python:/opt/python
instanceLifecycleConfig:
initializer:
handler: index.initialize
timeout: 60 # Timeout in seconds for the Initializer hook
preStop:
handler: index.preStop
timeout: 60 # Timeout in seconds for the PreStop hook
timeout değerini başlatma veya temizleme mantığınızı kapsayacak kadar uzun ayarlayın. YAML sözdizimi ayrıntıları için bkz. Serverless Devs ortak komutları.
Yaşam döngüsü kanca işlevi günlüklerini görüntüleme
Function Compute konsoluna giriş yapın. Sol gezinme bölmesinde Functions öğesine tıklayın.
Üst gezinme çubuğunda bir bölge seçin. Functions sayfasında işleve tıklayın.
İşlev ayrıntıları sayfasında Test Function sekmesine tıklayın ardından Test Function düğmesine tıklayın ve Logs > Function Logs yolunu izleyin.
Logs sekmesi hem çağrı günlüklerini hem de yaşam döngüsü kanca işlevi günlüklerini gösterir. Her kanca yürütmesi RequestId içeren Start ve End işaretleriyle çevrelenmiştir:
2024-03-04 17:57:28FC Initialize Start RequestId: 1-65e59b07-1520da26-bf73bbb91b69
2024-03-04 17:57:282024-03-04 09:57:28.192 1-65e59b07-1520da26-bf73bbb91b69 [info] initializer
2024-03-04 17:57:28FC Initialize End RequestId: 1-65e59b07-1520da26-bf73bbb91b69
2024-03-04 17:57:28FC Invoke Start RequestId: 1-65e59b07-1520da26-bf73bbb91b69
2024-03-04 17:57:28FC Invoke End RequestId: 1-65e59b07-1520da26-bf73bbb91b69
PreStop hook günlükleri de aynı biçimi takip eder:
2024-03-04 18:33:26FC PreStop Start RequestId: 93c93603-9fbe-4576-9458-193c8b213031
2024-03-04 18:33:262024-03-04 10:33:26.077 93c93603-9fbe-4576-9458-193c8b213031 [info] preStop
2024-03-04 18:33:26FC PreStop End RequestId: 93c93603-9fbe-4576-9458-193c8b213031
Sırada ne var
Örnek yaşam döngülerini yapılandırma — Tüm örnek yaşam döngüsü ayarları için tam başvuru kılavuzu.
python3-mysql örneği — MySQL veritabanı bağlantılarını yönetmek için Initializer ve PreStop hook'larının kullanımını gösteren eksiksiz bir örnek.