refactoring
This commit is contained in:
63
src/main.py
63
src/main.py
@@ -1,35 +1,14 @@
|
|||||||
#!/bin/python3
|
#!/bin/python3
|
||||||
from queue import Queue
|
import random as rd
|
||||||
|
from heapq import heappush, heappop
|
||||||
|
|
||||||
class NoServerFreeError(Exception):
|
class Event:
|
||||||
def __init__(self, message="No server free"):
|
def __init__(self, event_type, additional_options):
|
||||||
self.message = message
|
self.event_type = event_type
|
||||||
super().__init__(self.message)
|
if event_type == "request":
|
||||||
|
self.category = additional_options['category']
|
||||||
class Request:
|
elif event_type == "router_finish":
|
||||||
def __init__(self, lambda_val, current_time):
|
self.request = additional_options['request']
|
||||||
# exponential distribution, parameter λ
|
|
||||||
interval = random.expovariate(self.lambda_val)
|
|
||||||
new_time = self.current_time + interval
|
|
||||||
|
|
||||||
self.arrival_time = new_time
|
|
||||||
self.category = 1
|
|
||||||
|
|
||||||
|
|
||||||
class Server_cluster:
|
|
||||||
def __init__(self, cluster_size, category, service_rate):
|
|
||||||
self.category = category
|
|
||||||
self.cluster_size = cluster_size
|
|
||||||
self.finish_time = [0.0]*cluster_size
|
|
||||||
|
|
||||||
def process_request(self, request, current_time):
|
|
||||||
free_servers = [i for i in range(self.cluster_size) if self.finish_time[i] <= current_time]
|
|
||||||
if not free_servers:
|
|
||||||
raise NoServerFreeError()
|
|
||||||
else:
|
|
||||||
interval = random.expovariate(self.service_rate)
|
|
||||||
finish = current_time + interval
|
|
||||||
self.finish_time[free_servers[0]] = finish
|
|
||||||
|
|
||||||
|
|
||||||
class Simulation:
|
class Simulation:
|
||||||
@@ -45,7 +24,6 @@ class Simulation:
|
|||||||
# λ
|
# λ
|
||||||
self.lambda_val = lambda_val
|
self.lambda_val = lambda_val
|
||||||
|
|
||||||
self.router_queue = Queue(maxsize = 100)
|
|
||||||
self.router_state = 'idle' # 'idle', 'processing', 'blocked'
|
self.router_state = 'idle' # 'idle', 'processing', 'blocked'
|
||||||
|
|
||||||
self.event_queue = Queue() # (arrival_time, category)
|
self.event_queue = Queue() # (arrival_time, category)
|
||||||
@@ -55,5 +33,28 @@ class Simulation:
|
|||||||
self.lost_requests = 0
|
self.lost_requests = 0
|
||||||
self.response_times = []
|
self.response_times = []
|
||||||
|
|
||||||
|
def next_request():
|
||||||
|
# exponential distribution, parameter λ
|
||||||
|
interval = random.expovariate(self.lambda_val)
|
||||||
|
new_time = self.current_time + interval
|
||||||
|
arrival_time = new_time
|
||||||
|
|
||||||
|
category = rd.randint(1, C) if C>1 else 1
|
||||||
|
|
||||||
|
request = Event("request", {"category": category})
|
||||||
|
|
||||||
|
heappush(self.event_queue, (arrival_time, request))
|
||||||
|
|
||||||
|
def router_process(request):
|
||||||
|
self.router_state = 'processing'
|
||||||
|
router_finish = Event("router_finish", {"request": request})
|
||||||
|
heappush(self.event_queue, (arrival_time, router_finish))
|
||||||
|
|
||||||
|
def process_request(self, request, current_time):
|
||||||
|
interval = random.expovariate(self.service_rate)
|
||||||
|
finish = current_time + interval
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user