Conceitos Básicos

Simpy é uma biblioteca de simulação de eventos discretos. O comportamento de componentes ( como veículos, clientes ou mensagens) é modelado como processes. Todos os processes/processos estão em environment/ambiente. Eles interagem com o ambiente e um com o outro atráves de eventos.

Os processos são definidos através de simples Python generators. Você pode chamar as funções de processos ou métodos dos processos, da mesma maneira que chama uma função normal ou um método de uma classe. Durante seu ciclo de vida, eles criam eventos e os executa de acordo com a ordem que deverão ser acionados.

Quando um processo tem o retorno de um evento, o processo fica em modo suspended/suspenso. Simpy resumes/continua a execução do processo, quando o evento ocorre ( é dito que o evento é triggered/acionado). Diversos processos podem aguardar pelo mesmo evento. Simpy resume/aciona todos os eventos na mesma ordem em que foram retornados.

Eventos do tipo Timeout, são acionados após um determinado tempo ( da simulação ). Essa funcionalidade permite que um processo fique aguardando apenas por um tempo definido. Um Timeout e todos os outros eventos podem se criados com a execução de um método do tipo Environment no qual o processo se encontra (Environment.timeout() por exemplo).

Primeiro Processo

Nosso primeiro exemplo será um processo car. O car/carro alternará entre ser dirigido(drive) e estar estacionado (park) por um tempo. Quando ele estiver em movimento ( ou estacionando ), será impresso o tempo atual da simulação. Ou seja, sempre que o estado do processo mudar.

Então vamos começar:

>>> def car(env):
...     while True:
...         print('Estacionando a %d' % env.now)
...         parking_duration = 5
...         yield env.timeout(parking_duration)
...
...         print('Dirigindo em %d' % env.now)
...         trip_duration = 2
...         yield env.timeout(trip_duration)

O processo car requer uma referencia para a classe Environment (env) de modo ordenado para a criação/definição dos novos eventos relacionados a ele. O comportamento do car é descrito em um loop infinto. Lembrando que está função é um generator. Apesar dele nunca terminar (loop infinito), ele entrega o controle do fluxo das ações sempre que encontra a declaração yield. Uma vez que o evento(yield) é finalmente acionado(triggered) ( ou ocorre ), a simulação continua a execução do procedimento.

Como dito antes, nosso carro/car alterna entre estar estacionando/parking e estar em movimento/driving. É anunciado seu novo status imprimindo uma mensagem e o tempo atual da simulação ( retornado pela propriedade Environment.now). Então é chamada a função Environment.timeout() para criar um evento do tipo Timeout. Este evento determina o ponto exato em que o carro deixou de estacionar/parking ou de estar em movimento/driving, respectivamente. Através do evento ‘yielding’, é informado para a simulação que será aguardada a mudança de estado.

Já que o comportamento do nosso carro foi definido/modelado, vamos criar uma instância dele e ver como ele se comporta:

>>> import simpy
>>> env = simpy.Environment()
>>> env.process(car(env))
<Process(car) object at 0x...>
>>> env.run(until=15)
Estacionado em 0
Dirigindo em 5
Estacionando em 7
Dirigindo em 12
Estacionando em 14

A primeira coisa que fazemos é criar uma instância da classe Environment. Essa instância ( no caso env ) é então passada para o processo car em car(env). Que por sua vez cria um process generator que para ser iniciado tem de ser declarado na instância env, para isso se usa o método Environment.process().

Observer, que neste momento, nada do código/procedimento definido em nosso processo está sendo executado ainda. Sua execução é agendada de acordo com o tempo da simulação

O Process retornado por process() pode ser usado para interagir com o processo ( na próxima seção veremos mais sobre isso).

E finalmente a simulação começa quando é executado run() e definimos quando será o término da simulação.

E agora?

Já que você se familiarizou com a terminologia utilizada no Simpy e seus conceitos básicos. Na próxima seção, vamos entender como funciona a interação do processo.