[SimPy] 파이썬 시뮬레이션: 기초 알아보기
1. Environment
Environment 클래스를 객체화(선언)하는 것은 새로운 게임을 생성하는 것과 같다.
import simpy
env = simpy.Environment()
위와 같이 simpy의 Environment 클래스를 인스턴스화 하여 environment를 정의한다.
2. Process Interaction
Process는 다른 프로세스를 기다리거나 중간에 interrupt를 걸 수 있게 하는 env의 기능이다.
import simpy
env = simpy.Environment()
car = Car(env)
env.run(until=15)
이 차는 전기차여서 충전시간이 필요하다. 충전은 charge()라는 함수로 구현하고 '5'라는 충전시간이 지나면 차는 출발한다.
class Car(object):
def __init__(self, env):
self.env = env
self.action = env.process(self.run())
def run(self):
charge_duration = 5
yield self.env.timeout(self.charge(charge_duration))
def charge(self, duration):
yield self.env.timeout(duration)
운전자가 충전을 다 기다리지 않고 출발을 원한다면 어떻게 구현해야 할까? 충전은 run() 함수 안에서 돌아가므로, run()에 interrupt를 거는 함수를 만들 필요가 있다.
2-1 Interrupting another process
interrupting을 구현하기 위해 driver라는 함수를 만들었다.
def driver(env, car):
yield env.timeout(3)
car.action.interrupt()
이 함수는 클래스 내부에서 선언하지 않았다. 이 함수는 car라는 클래스 인스턴스를 파라미터로 받아 env.process를 interrupt 한다.
import simpy
env = simpy.Environment()
car = Car(env)
env.process(driver(env, car))
env.run(until=15)
3. Resources
리소스란 사용 가능한 자원이다. 예를 들어, 충전기가 5개인 충전소에 여러대의 차들이 충전을 하러 오는 상황을 생각해 볼 수 있다. 그리고 일반적인 카페와 같이 만들어서 파는 생산자-소비자 관계가 있을 수 있다.
def car(env, name, station, driving_time, charge_duration):
yield env.timeout(driving_time) # 차가 돌아다니다가 들어올 시간
print(f'{name} 차가 충전소에 {env.now}에 도착했습니다.)
with station.request() as req:
yield req
print(f'{name} 차가 충전을 시작한 시간 {env.now}')
yield env.timeout(charge_duration)
print(f'{name} 차의 충전이 완료된 시간 {env.now}')
import simpy
env = simpy.Environment()
station = simpy.Resource(env, capacity=2)
for i in range(4):
env.process(car(env, f'Car {i}', station, i*2, 5))
env.run()
Resource클래스를 station으로 인스턴스화했고 Resource 인스턴스는 request() 함수를 사용할 수 있다. 이 함수는 리소스인 station이 다시 사용가능해질 때까지 기다리게 한다. station의 리소스 총량은 capacity 값으로 정할 수 있다.
여기서 충전소가 차에게 리소스를 제공하는 형태는 FIFO(first in first out) 방식이다.
'Computer Science > Python' 카테고리의 다른 글
[Python] Unable to create process using~(Flask, Locust etc.) (0) | 2022.04.07 |
---|---|
[sklearn] cython 코드 수정하기 (0) | 2020.08.27 |
[python] pip install - urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] (0) | 2017.11.29 |
[Tensorflow] 텐서플로우 자료형 (0) | 2017.06.03 |
[Python] Virtualenv 가상환경 구성하기 (0) | 2017.05.31 |