I am trying to code Round Robin scheduling algorithm in python3.10. But I kept getting this error, when i try to access elements of each list inside deque self.__ready_queue:
Traceback (most recent call last):
File "/home/neo/Documents/Python/Scheduling Algorithms/rr.py", line 94, in <module>
rr.calculate()
File "/home/neo/Documents/Python/Scheduling Algorithms/rr.py", line 61, in calculate
if list(self.__ready_queue)[i][2] <= self.time_quantum:
TypeError: 'int' object is not subscriptable
I tried printing it but it worked fine, but when i used it in conditionals or inside f-string, it is giving that error Here is the code block that is producing that error:
def calculate(self):
grant_chart = f'{self.__ready_queue[0][1]} '
n_a_t = 0
completion_times = []
i = 0
while len(self.__ready_queue) != 0:
if self.__ready_queue[i][2] <= self.time_quantum:
n_a_t += self.__ready_queue[i][2]
completion_times.append([self.__ready_queue[i][0], n_a_t])
self.__ready_queue.popleft()
else:
n_a_t += self.time_quantum
item = self.__ready_queue[i][2]
self.__ready_queue[i][2] -= self.time_quantum
self.__ready_queue.popleft()
self.__ready_queue.append(item)
gant_chart += f'{self.__ready_queue[i][0]} {n_a_t} '
if i+1 > len(self.__ready_queue):
i = 0
else:
i += 1
print(gant_chart)
And here is all the code:
from tabulate import tabulate
from collections import deque
# INFO
# Completion Time - time to complete certain process
# Turn Around Time = Completion Time - Arrival Time
# Constants
ARRIVAL_TIME = 'arrival_time'
BURST_TIME = 'burst_time'
COMPLETION_TIME = 'completion_time'
WAITING_TIME = 'waiting_time'
TURNAROUND_TIME = 'turnaround_time'
class RoundRobin:
def __init__(self, processes: list, arrival_times: list, burst_times: list, time_quantum: int):
self.time_quantum = time_quantum
self.processes = processes
self.arrival_times = arrival_times
self.burst_times = burst_times
self.__waiting_times = [0] * len(self.processes)
self.__turnaround_times = [0] * len(self.processes)
self.__completion_times = [0] * len(self.processes)
self.__zipped = zip(
self.processes,
self.arrival_times,
self.burst_times,
self.__completion_times,
self.__waiting_times,
self.__turnaround_times
)
self.__mapped = list(map(lambda x: list(x), self.__zipped))
self.__sorted = sorted(self.__mapped, key=lambda x : x[1])
self.__ready_queue = deque([[x[0], x[1], x[2]] for x in self.__sorted])
self.__dicted = {
x[0]: {
ARRIVAL_TIME: x[1],
BURST_TIME: x[2],
COMPLETION_TIME: self.__completion_times[self.processes.index(x[0])],
WAITING_TIME: self.__waiting_times[self.processes.index(x[0])],
TURNAROUND_TIME: self.__turnaround_times[self.processes.index(x[0])]}
for x in self.__sorted
}
self.__table = tabulate(self.__mapped, headers=['Process ID', 'Arrival Time', 'Burst Time', 'Completion Time', 'Waiting Time', 'Turnaround Time'], tablefmt='github')
def calculate(self):
gant_chart = f'{self.__ready_queue[0][1]} '
n_a_t = 0
completion_times = []
i = 0
while len(self.__ready_queue) != 0:
if self.__ready_queue[i][2] <= self.time_quantum:
n_a_t += self.__ready_queue[i][2]
completion_times.append([self.__ready_queue[i][0], n_a_t])
self.__ready_queue.popleft()
else:
n_a_t += self.time_quantum
item = self.__ready_queue[i][2]
self.__ready_queue[i][2] -= self.time_quantum
self.__ready_queue.popleft()
self.__ready_queue.append(item)
gant_chart += f'{self.__ready_queue[i][0]} {n_a_t} '
if i+1 > len(self.__ready_queue):
i = 0
else:
i += 1
print(gant_chart)
print(self.__ready_queue[i][0])
def print_as_diagram(self):
print(self.__table)
rr = RoundRobin(('p1', 'p2', 'p3', 'p4'), (0, 1, 2, 3), (8, 4, 10, 5), 4)
# rr.print_as_diagram()
rr.calculate()