Interrupções de eventos
De modo semelhante ao que vimos com recursos, os eventos também podem ser interrompidos em SimPy. Como o SimPy aproveita-se dos comandos de interrupção já existentes no Python, pode-se utilizar o bloco try... except
e assim capturar a interrupção em qualquer parte do modelo.
Considere um exemplo simples em que um jovem Jedi tem sua seção de meditação matinal interrompida por um cruel Lord Sith interessado em convertê-lo para o Lado Negro.
Construir um modelo de simulação deste sistema, é tarefa simples: precisamos de uma função que representa o Jedi meditando e outra que interrompe o processo em determinado momento (lembre-se que um processo é também um evento para o SimPy).
O SimPy tem dois métodos diferentes para interroper um evento: interrupt
ou fail.
Interrompendo um evento com o método interrupt
interrupt
Criaremos duas funções: forca
que representa o processo de meditação e ladoNegro
que representa o processo de interrupção da meditação. Inicialmente, interromperemos o processo forca
por meio do método interrupt
. Uma possível máscara para o modelo ficaria:
Para este exemplo, o processo de meditação é bem simples, pois estamos mais interessados em aprender sobre interrupções:
Portanto, a cada 1 unidade de tempo, o Jedi fala um frase para manter-se concentrado. O processo de interrupção por sua vez, recebe como parâmetro de entrada o processo (ou evento) a ser interrompido. Apenas para ilustrar melhor o exemplo, vamos considerar que após 3 unidades de tempo, a função interrompe o processo (ou evento) de meditação:
Portanto, a interrupção de um evento ou processo qualquer é invocada pelo método .interrupt().
Por exemplo, dado que processo ou evento proc
, podemos interrompê-lo com a linha de código:
Se você executar o modelo anterior, a coisa até começa bem, mas depois surge uma supresa desagradável:
O que essa longa mensagem de erro nos faz lembrar é que o método .interrupt()
vai além de interromper um mero evento do SimPy, ele interrompe o programa todo.
Mas, jovem leitor Jedi, temos duas maneiras de contornar o problema: com a lógica de controle de exceção do Pythontry...except
ou com a propriedade .defused,
como veremos a seguir.
Método de controle de interrupção 1: lógica de exceção try... except
try... except
Neste caso, a solução é razoavelmente simples, basta acrescentarmos ao final do programa (ou em outra parte conveniente) uma lógica de exceção do SimPy, simpy.Interrupt,
como no exemplo a seguir:
Quando executado, o modelo anterior fornece:
É importante notar que depois da interrupção proc.interrupt()
o modelo ainda executa a última linha do processo ladoNegro
(basicamente, imprime "Welcome, young Sith") para, a seguir, executar o comando dentro do except simpy.Interrupt.
Método de controle de interrupção 2: alterando o atributo defused
defused
No caso anterior, o leitor deve ter notado que, ao interromper o processo, interrompemos a simulação por completo, pois nossa lógica de exceção está ao final do código.
E se quisésemos apenas paralizar o processo (ou evento) sem que isso impactasse em toda a simulação? Neste caso, SimPy fornece um atributo defused
para cada evento que, quando alterado para True
, faz com que a interrupção seja "desarmada".
Vamos alterar o atributo defused
do processo interrompido no exemplo anterior:
Quando executado, o modelo anterior fornece:
Novamente a execução do processo de interrupção vai até o fim e a interrupção que poderia causar a paralização de todo o modelo é desarmada.
Portanto, se o objetivo é desarmar a interrupção, basta tornar True
o atributo defused
do evento.
Interrompendo um evento com o método fail
fail
De modo semelhante a provocar um interrupção, podemos provocar uma falha no evento. O interessante, neste caso, é que podemos informar a falha
Last updated