Skip to content
Snippets Groups Projects
Commit d8d916ba authored by jkerdreu's avatar jkerdreu
Browse files

Added task list, to be able to kill tasks without killing the whole process (needed for HASS)

git-svn-id: https://redmine.imt-atlantique.fr/svn/xaal/code/Python/branches/0.7@2970 b32b6428-25c9-4566-ad07-03861ab6144f
parent b949e653
No related branches found
No related tags found
No related merge requests found
......@@ -20,7 +20,7 @@ logger = logging.getLogger(__name__)
class AsyncEngine(core.EngineMixin):
__slots__ = ['__txFifo','_loop','_hooks','_watchdog_task','_kill_counter','running_event','watchdog_event','started_event']
__slots__ = ['__txFifo','_loop','_tasks','_hooks','_watchdog_task','_kill_counter','running_event','watchdog_event','started_event']
def __init__(self,address=config.address,port=config.port,hops=config.hops,key=config.key):
core.EngineMixin.__init__(self,address,port,hops,key)
......@@ -28,6 +28,7 @@ class AsyncEngine(core.EngineMixin):
self.__txFifo = asyncio.Queue() # tx msg fifo
self._loop = None # event loop
self._hooks = [] # hooks
self._tasks = [] # tasks
self._watchdog_task = None # watchdog task
self._kill_counter = 0 # watchdog counter
......@@ -71,7 +72,8 @@ class AsyncEngine(core.EngineMixin):
return self._loop
def all_tasks(self):
return list(asyncio.all_tasks(self.get_loop()))
#return list(asyncio.all_tasks(self.get_loop()))
return self._tasks
#####################################################
# timers
......@@ -194,15 +196,16 @@ class AsyncEngine(core.EngineMixin):
logger.warning('Engine already started')
return
self.started_event.set()
loop = self.get_loop()
loop.create_task(self.start_task(),name='Boot')
loop.create_task(self.receive_task(),name='RecvQ')
loop.create_task(self.send_task(),name='SendQ')
loop.create_task(self.timer_task(),name='Timers')
loop.create_task(console(locals()),name='Console')
self.new_task(self.start_task(),name='Boot')
self.new_task(self.receive_task(),name='RecvQ')
self.new_task(self.send_task(),name='SendQ')
self.new_task(self.timer_task(),name='Timers')
self.new_task(console(locals()),name='Console')
def new_task(self,coro,name=None):
return self.get_loop().create_task(coro,name=name)
task = self.get_loop().create_task(coro,name=name)
self._tasks.append(task)
return task
def setup_alives_timer(self):
# needed on stop-start sequence
......@@ -220,6 +223,8 @@ class AsyncEngine(core.EngineMixin):
for task in self.all_tasks():
if task!=self._watchdog_task:
task.cancel()
await asyncio.sleep(0.1)
self._tasks.remove(task)
def sigkill_handler(self,signal,frame):
print("", end = "\r") #remove the uggly ^C
......@@ -242,9 +247,8 @@ class AsyncEngine(core.EngineMixin):
self.start()
if self._watchdog_task == None:
# start the watchdog task
loop = self.get_loop()
self._watchdog_task=loop.create_task(self.watchdog_task(),name='Watchdog task')
loop.run_until_complete(self._watchdog_task)
self._watchdog_task = self.new_task(self.watchdog_task(),name='Watchdog task')
self.get_loop().run_until_complete(self._watchdog_task)
else:
logger.warning('Engine already running')
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment