Recursos Compartilhados

Simpy oferece 3 tipos de resources que o ajudam a modelar suas simulações, onde múltiplos processos podem usar um recurso com capacidade limitada ( ex., carros em um posto com uma limitada quantidade de bombas ) ou o clássico problema produtor-consumidor.

Nesta seção, faremos uma breve introdução da classe Resource do Simpy.

Uso básico da classe Resource

Faremos uma modificação simples no nosso processo do carro elétrico car que foi criado na última seção.

O carro agora irá para um estação de carga da bateria(bcs) e solicitar 1 dos 2 pontos de carga ( charging spots ). Se todos os pontos estiverem em uso, ele aguarda a liberação de um deles. Só então, obviamente, deve começar a carregar a bateria e assim deixar a estação:

>>> def car(env, name, bcs, driving_time, charge_duration):
...     # Simular seguir para a BCS
...     yield env.timeout(driving_time)
...
...     # Solicita um ponto de carga
...     print('%s saindo em %d' % (name, env.now))
...     with bcs.request() as req:
...         yield req
...
...         # Carrega a bateria
...         print('%s carregando em %s' % (name, env.now))
...         yield env.timeout(charge_duration)
...         print('%s deixando a bcs em %s' % (name, env.now))

O método de Resource request() gera um evento que permite que você aguarde até que o recurso fique disponível novamente. Se você retornar, você “alocará” o recurso até que você o libere/release.

Caso utilize o recurso usando a declaração with como demonstrado a seguir, o recurso é autimaticamente liberado. Porém se você chamar o request() sem declarar with, você toma pra si a responsabilidade de chamar o método release() quando você terminar de usar o recurso.

Quando liberar um recurso, o processo que estava aguardando por ele é continuado e passa a utilizar o recurso. A ordenação padrão de Resource na fila de espera segue o modelo de FIFO (first in—first out).

Um recurso precisa referenciar a classe Environment e ter uma capacidade/capacity determinada quando criado:

>>> import simpy
>>> env = simpy.Environment()
>>> bcs = simpy.Resource(env, capacity=2)

Tendo entendido essa primeira parte, podemos então criar os processos car e também informar uma referência para nosso resource/recurso como parâmetros adicionais:

>>> for i in range(4):
...     env.process(car(env, 'Car %d' % i, bcs, i*2, 5))
<Process(car) object at 0x...>
<Process(car) object at 0x...>
<Process(car) object at 0x...>
<Process(car) object at 0x...>

Então, finalmente podemos iniciar a simulação. Desde que os processos car Finally, we can start the simulation. Since the car processes all terminate on their own in this simulation, we don’t need to specify an until time—the simulation will automatically stop when there are no more events left:

>>> env.run()
Car 0 arriving at 0
Car 0 starting to charge at 0
Car 1 arriving at 2
Car 1 starting to charge at 2
Car 2 arriving at 4
Car 0 leaving the bcs at 5
Car 2 starting to charge at 5
Car 3 arriving at 6
Car 1 leaving the bcs at 7
Car 3 starting to charge at 7
Car 2 leaving the bcs at 10
Car 3 leaving the bcs at 12

Note that the first two cars can start charging immediately after they arrive at the BCS, while cars 2 an 3 have to wait.

What’s Next

You should now be familiar with SimPy’s basic concepts. The next section shows you how you can proceed with using SimPy from here on.