Added blocking/async managers

This commit is contained in:
GeoffreyCoulaud
2023-05-29 00:05:44 +02:00
parent aeab1de4a9
commit b99c058cd7
7 changed files with 91 additions and 46 deletions

View File

@@ -51,34 +51,29 @@ class Pipeline(GObject.Object):
def advance(self):
"""Spawn tasks for managers that are able to run for a game"""
for manager in self.ready:
self.waiting.remove(manager)
self.running.add(manager)
data = (manager,)
task = Task.new(self, manager.cancellable, self.manager_task_callback, data)
task.set_task_data(data)
task.run_in_thread(self.manager_task_thread_func)
# Separate blocking / async managers
managers = self.ready
blocking = set(filter(lambda manager: manager.blocking, managers))
parallel = managers - parallel
# Schedule parallel managers, then run the blocking ones
for manager in (*parallel, *blocking):
manager.run(self.game)
@GObject.Signal(name="manager-started", arg_types=(object,))
def manager_started(self, manager: Manager) -> None:
"""Signal emitted when a manager is started"""
pass
def manager_task_thread_func(self, _task, _source_object, data, cancellable):
"""Thread function for manager tasks"""
manager, *_rest = data
self.emit("manager-started", manager)
manager.run(self.game)
@GObject.Signal(name="manager-done", arg_types=(object,))
def manager_done(self, manager: Manager) -> None:
"""Signal emitted when a manager is done"""
pass
def manager_task_callback(self, _source_object, _result, data):
"""Callback function for manager tasks"""
manager, *_rest = data
self.running.remove(manager)
self.done.add(manager)
def on_manager_started(self, manager: Manager) -> None:
self.emit("manager-started", manager)
def on_manager_done(self, manager: Manager) -> None:
self.emit("manager-done", manager)
self.advance()