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. O Simpy resumes/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).

Nosso primeiro processo

Nosso primeiro exemplo será um processo chamado car. O processo car 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.

Vamos lá:

>>> def car(env):
...     while True:
...         print('Start parking at %d' % env.now)
...         parking_duration = 5
...         yield env.timeout(parking_duration)
...
...         print('Start driving at %d' % env.now)
...         trip_duration = 2
...         yield env.timeout(trip_duration)

O processo car requer uma referência 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, o processo car alterna entre dois estados: estar estacionando/parking e estar em movimento/driving. É anunciado seu novo status imprimindo uma mensagem e o tempo atual da simulação ( informado através da 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 processo 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)
Start parking at 0
Start driving at 5
Start parking at 7
Start driving at 12
Start parking at 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().

Observe, 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.