scheduler.py 2.99 KiB
from time import sleep
from schedulable import Schedulable
class Scheduler(Schedulable):
def __init__(self):
Schedulable.__init__(self, client_id="Scheduler")
self.sleep_between_cycle = 5
self.nbr_agent = 0
self.subscribe("amas/agent/new", self.update_nbr_agent)
self.subscribe("amas/action_done", self.update_schedulable)
self.subscribe("env/action_done", self.update_schedulable)
self.agent_waiting = 0
self.schedulable_waiting = 0
print("Init done")
def update_schedulable(self, client, userdata, message):
self.schedulable_waiting += 1
print("__Schedulable is waiting")
def update_nbr_agent(self, client, userdata, message):
self.nbr_agent += 1
self.subscribe("agent/" + str(message.payload.decode("utf-8")) + "/cycle_done", self.agent_done)
print("__Update agent : ",self.nbr_agent, str(message.payload.decode("utf-8")))
def agent_done(self, client, userdata, message):
self.agent_waiting += 1
print("__Agent done")
def wait_agent(self):
while self.agent_waiting < self.nbr_agent:
sleep(self.wait_delay)
self.agent_waiting = 0
def wait_schedulable(self):
while self.schedulable_waiting < 2:
sleep(self.wait_delay)
self.schedulable_waiting = 0
def first_part(self) -> None:
"""
first part of a cycle
"""
self.client.publish("scheduler/schedulable/wakeup", "")
# Amas on cycle begin
# Environment on cycle begin
self.wait_schedulable()
def main_part(self) -> None:
"""
main part of a cycle
"""
self.client.publish("scheduler/agent/wakeup", "")
# Agent doing phase 1
self.wait_agent()
self.client.publish("scheduler/agent/wakeup", "")
# agent doing phase 2
self.wait_agent()
def last_part(self) -> None:
"""
last part of a cycle
"""
self.client.publish("scheduler/schedulable/wakeup", "")
# Amas on cycle end
# Environment on cycle end
self.wait_schedulable()
def run(self) -> None:
"""
main part of amak core
"""
# wait that all schedulable have init
print("Waiting schedulable")
self.wait_schedulable()
# Wait that all agent have init
print("Waiting agents :", self.nbr_agent)
self.wait_agent()
while not self.exit_bool:
print("Cycle : ", self.nbr_cycle)
print("-First part")
self.first_part()
print("-Main part")
self.main_part()
print("-Last part")
self.last_part()
# sleep(self.sleep_between_cycle)
input()
self.nbr_cycle += 1
self.client.publish("scheduler/schedulable/wakeup", "")
self.client.publish("scheduler/agent/wakeup", "")
sleep(2)
if __name__ == '__main__':
s = Scheduler()
s.run()