Ao iniciar ou encerrar uma instância de função, talvez seja necessário executar lógica personalizada — por exemplo, abrir uma conexão com o banco de dados antes da primeira requisição ou liberar recursos adequadamente antes da destruição da instância. Os hooks de ciclo de vida permitem registrar funções Python que o Function Compute chama automaticamente nesses dois momentos do ciclo de vida da instância.
Dois tipos de hook estão disponíveis para runtimes Python:
Initializer hook — executado uma vez após o início da instância, antes que o handler processe qualquer requisição.
PreStop hook — executado antes da destruição da instância, permitindo a liberação de recursos.
Como funcionam os hooks de ciclo de vida
Uma instância de função passa por três fases:
|
Fase |
Momento de execução |
Hook |
|
Init |
Início da instância |
Initializer hook (se configurado) |
|
Invoke |
O handler processa requisições |
— |
|
Shutdown |
Destruição da instância |
PreStop hook (se configurado) |
A execução de hooks de ciclo de vida é faturada à mesma taxa das invocações regulares. Os logs aparecem em Function Logs, Real-time Logs e Advanced Logs, mas não na lista de requisições de invocação.
Initializer hook
O Initializer hook é executado uma vez por instância, após o início e antes da primeira invocação do handler. O Function Compute garante exatamente uma execução por instância.
Comportamento em caso de falha: Se o hook falhar, a invocação retornará um erro. Na próxima invocação, o Function Compute criará uma nova instância e executará o Initializer hook novamente.
Assinatura do método:
|
Parâmetro |
Descrição |
|
|
Fornece metadados de runtime para a invocação atual. |
|
Valor de retorno |
Nenhum. |
Exemplo: inicializar uma conexão com banco de dados
Um padrão comum é abrir recursos compartilhados no Initializer hook para que cada invocação do handler os reutilize, evitando reconexões a cada requisição.
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")
O nome do método (initialize neste exemplo) deve corresponder ao valor configurado em Initializer Hook. Por exemplo, definir Initializer Hook como index.initialize instrui o Function Compute a chamar o método initialize em index.py.
PreStop hook
O PreStop hook é executado antes da destruição de uma instância de função. Sua assinatura de método é idêntica à do Initializer hook: um parâmetro context e nenhum valor de retorno.
Exemplo: fechar uma conexão com banco de dados
def preStop(context):
global db_connection
if db_connection:
db_connection.close()
print("Database connection closed")
As instâncias de função permanecem em cache e não são destruídas imediatamente após a última invocação. Portanto, os logs do PreStop podem não aparecer de imediato. Para acionar rapidamente um PreStop hook durante testes, atualize a configuração ou o código da função. Essa ação recicla as instâncias existentes e permite visualizar os logs do PreStop em Function Logs .
Configure hooks de ciclo de vida
Usar o console do Function Compute
Faça login no console do Function Compute. No painel de navegação à esquerda, clique em Functions.
Selecione a função desejada.
Nas configurações da função, defina os campos Initializer Hook e PreStop Hook no formato
<filename>.<method>— por exemplo,index.initializeouindex.preStop.
Para obter etapas detalhadas, consulte Configurar ciclos de vida de instância.

Usar Serverless Devs
Adicione instanceLifecycleConfig sob o recurso da função em s.yaml. Ambos os hooks exigem um handler (no formato <filename>.<method>) e um timeout (em segundos).
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
Defina o timeout com duração suficiente para cobrir a lógica de inicialização ou limpeza. Para detalhes sobre a sintaxe YAML, consulte Comandos comuns do Serverless Devs.
Visualize logs de hooks de ciclo de vida
Faça login no console do Function Compute. No painel de navegação à esquerda, clique em Functions.
Na barra de navegação superior, selecione uma região. Na página Functions, clique na função desejada.
Na página de detalhes da função, clique na aba Test Function. Em seguida, clique em Test Function e escolha Logs > Function Logs.
A aba Logs exibe tanto os logs de invocação quanto os de hooks de ciclo de vida. Cada execução de hook é delimitada pelos marcadores Start e End, que incluem o RequestId:
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
Os logs do PreStop hook seguem o mesmo formato:
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
Próximos passos
Configurar ciclos de vida de instância — referência completa de todas as configurações de ciclo de vida de instância.
Exemplo python3-mysql — exemplo completo que utiliza hooks Initializer e PreStop para gerencie conexões com banco de dados MySQL.