You might find some code useful.
example
another example.
example
from enum import Enum Status = Enum("Status", "waiting, init, running, completed") class Task: queue = [] running = 0 def __init__(self, task, status): self.var = task self.status = status def routine(self): if self.status in (Status.init, Status.running): self.status = self.var.routine(self.status) @classmethod def add(cls, task, status=Status.waiting): cls.queue.append(cls(task, status)) @classmethod def empty(cls): return len(cls.queue) == 0 @classmethod def routines(cls): print("\nTask List") new_queue = [] cls.running = 0 for q in cls.queue: print("\n name:", q.var.name) print(" - status:", q.status, "\n") q.routine() if q.status in (Status.init, Status.running): cls.running += 1 if q.status != Status.completed: new_queue.append(q) cls.queue = new_queue if cls.running == 0: if len(cls.queue) > 0: cls.queue[0].status = Status.init class AutoPilot: def __init__(self): pass @classmethod def turn(cls, target_angle, current_angle): obj = cls() obj.name = "Turn" obj.target_angle = target_angle obj.current_angle = current_angle obj.routine = obj.turn_craft_oaf return obj @classmethod def stationary(cls): obj = cls() obj.name = "Stationary" obj.routine = obj.stationary_position return obj def turn_craft_oaf(self, status): print("Routine 'turn_craft_oaf' called") return Status.completed def stationary_position(self, status): print("Routine 'stationary' called") if status == Status.init: print("Routine 'stationary' init") self.center = 0 return Status.running else: self.center += 1 if(self.center >= 2): print("Routine 'stationary' completed") return Status.completed return status def main(): Task.add(AutoPilot.turn(90, 10), Status.init) Task.add(AutoPilot.stationary()) while not Task.empty(): Task.routines() main()
another example.
from enum import Enum Status = Enum("Status", "waiting, init, running, completed") class Task: queue = [] running = 0 def __init__(self, task, status): self.task = task self.status = status def routine(self): if self.status in (Status.init, Status.running): self.task.routine(self) @classmethod def add(cls, task, status=Status.waiting): cls.queue.append(cls(task, status)) @classmethod def empty(cls): return len(cls.queue) == 0 @classmethod def routines(cls): print("\nTask List") new_queue = [] cls.running = 0 for q in cls.queue: print("\n name:", q.task.name) print(" - status:", q.status, "\n") q.routine() if q.status in (Status.init, Status.running): cls.running += 1 if q.status != Status.completed: new_queue.append(q) cls.queue = new_queue if cls.running == 0: if len(cls.queue) > 0: cls.queue[0].status = Status.init class AutoPilot: def __init__(self, name, routine): self.name = name self.routine = routine @classmethod def turn_task(cls, target_angle, current_angle): obj = cls("Turn", cls.turn_craft_oaf) obj.target_angle = target_angle obj.current_angle = current_angle return obj @classmethod def stationary_task(cls): obj = cls("Stationary", cls.stationary_position) return obj @staticmethod def turn_craft_oaf(obj): print("Routine 'turn_craft_oaf' called") obj.status = Status.completed @staticmethod def stationary_position(obj): print("Routine 'stationary_position' called") if obj.status == Status.init: print("Routine 'stationary_position' init") obj.task.center = 0 obj.status = Status.running else: obj.task.center += 1 if(obj.task.center >= 2): print("Routine 'stationary_position' completed") obj.status = Status.completed def main(): Task.add(AutoPilot.turn_task(90, 10), Status.init) Task.add(AutoPilot.stationary_task()) while not Task.empty(): Task.routines() main()
99 percent of computer problems exists between chair and keyboard.