server cluster and request class
This commit is contained in:
59
src/main.py
Normal file
59
src/main.py
Normal file
@@ -0,0 +1,59 @@
|
||||
#!/bin/python3
|
||||
from queue import Queue
|
||||
|
||||
class NoServerFreeError(Exception):
|
||||
def __init__(self, message="No server free"):
|
||||
self.message = message
|
||||
super().__init__(self.message)
|
||||
|
||||
class Request:
|
||||
def __init__(self, lambda_val, current_time):
|
||||
# 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:
|
||||
def __init__(self, C, lambda_val):
|
||||
# C clusters of K servers
|
||||
self.C = C
|
||||
self.K = 12 // C
|
||||
# service rate exponential distribution parameter
|
||||
service_rates = {1: 4/20, 2:7/20, 3:10/20, 6:14/20}
|
||||
self.service_rate = service_rates[C]
|
||||
# router request processing time
|
||||
self.router_processing_time = (C - 1) / C
|
||||
# λ
|
||||
self.lambda_val = lambda_val
|
||||
|
||||
self.router_queue = Queue(maxsize = 100)
|
||||
self.router_state = 'idle' # 'idle', 'processing', 'blocked'
|
||||
|
||||
self.event_queue = Queue() # (arrival_time, category)
|
||||
self.current_time = 0.0
|
||||
|
||||
self.total_requests = 0
|
||||
self.lost_requests = 0
|
||||
self.response_times = []
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user