Adicionando funções aos eventos com callbacks
Adicionando callbacks
aos eventos
callbacks
aos eventosSimPy possui uma ferramenta tão curiosa quanto poderosa: os callbacks.
Um callback
é uma função que você acrescenta ao final de um evento. Por exemplo, considere que quando o evento da tartaruga (ou da lebre) termina, desejamos imprimir o vencedor na tela. Assim, quando o evento é processado, desejamos que ele processe a seguinte função, que recebe o evento como único parâmetro de entrada:
Toda função para ser anexada como um callback
, deve possuir como parâmetro de chamada apenas um único evento. Note também, que o valor de env.now
impresso na tela é possível pois env
é uma variável global para o Python. (Caso você ainda tenha alguma dificuldade para entender como o Python lida com variáveis globais e locais, um bom caminho é ler este bom guia).
Para anexarmos a função campeão
a um evento, utilizaremos o método callbacks.append(função_criada):
O código completo do modelo com callbacks
ficaria:
Note como o código ficou razoavelmente mais compacto, por eliminamos toda a codificação referente aos testes if...then...else
para determinar que é o campeão.
Quando executado, o modelo fornece como resultado:
OPS!
Aos 5.4 minutos a lebre, que chegou depois, foi declarada campeã também. Como isso aqui não é a Federação Paulista de Futebol, temos de corrigir o modelo e garantir que vença sempre quem chegar primeiro.
Uma solução prática seria criar uma variável global que se torna True
quando o primeiro corredor ultrapassa a linha, de modo que a função campeao
consiga distinguir se já temos um vencedor ou não:
A função campeao
agora deve lidar com uma lógica de desvio de fluxo para determinar se evento representa um campeão ou não:
Quando simulado, o modelo fornece como saída:
Você pode adicionar quantas funções de callback
quiser ao seu evento, mas lembre-se que manipular um modelo diretamente por eventos tende a deixar o código ligeiramente confuso e a boa prática recomenda não economizar nos comentários.
Todo processo é um evento
Quando um processo é gerado pelo comando env.process(),
o processo gerado é automaticamente tratado como um evento pelo SimPy. Você pode igualmente adicionar callbacks
aos processos ou mesmo retornar um valor (como já vimos na seção....).
Por exemplo, vamos acrescentar uma função de callback
para ao processo corrida
que informa o final da corrida para o público:
Precisamos agora, modificar apenas os comandos que inicializam a função corrida,
anexando o callback
criado:
Note que, além de adicionarmos a função final
como callback
da função corrida,
modificamos o comando env.run()
para que ele simule até que a função corrida
termine seu processamento. (Experimente substituir a linha env.run(proc)
por env.run(until=10)
e verifique o que acontece).
Quando executado, o modelo fornece como saída:
Uma boa pedida para callbacks
é construir funções que calculem estatísticas de termino de processamento ou, como veremos na próxima seção, quando desejamos trabalhar com falhas.
Conceitos desta seção
Conteúdo | Descrição |
| adiciona um |
Desafio
Desafio 26: acrescente à função
final
um comando para armazenar quem venceu e em que tempo. Simule para 10 replicações e calcule a média e a porcentagem de vitórias de cada corredor.
Last updated