diff --git a/src/main.py b/src/main.py index 9a73136..a70096c 100644 --- a/src/main.py +++ b/src/main.py @@ -1,35 +1,14 @@ #!/bin/python3 -from queue import Queue +import random as rd +from heapq import heappush, heappop -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 Event: + def __init__(self, event_type, additional_options): + self.event_type = event_type + if event_type == "request": + self.category = additional_options['category'] + elif event_type == "router_finish": + self.request = additional_options['request'] class Simulation: @@ -45,7 +24,6 @@ class Simulation: # λ 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) @@ -55,5 +33,28 @@ class Simulation: self.lost_requests = 0 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 + + +