Files
controller-wisetopdataserver/python/biopro/project/task_manager.py
T

127 lines
4.0 KiB
Python
Raw Normal View History

2022-02-07 20:27:30 +08:00
from json import loads as json_parse, dumps as _json_stringify
2022-04-16 10:50:37 +08:00
from socket import if_nametoindex
2022-04-08 11:17:07 +08:00
from typing import Dict, List, Optional, Any
2022-02-10 00:49:49 +08:00
from xml.dom.expatbuilder import parseString
2022-02-07 20:27:30 +08:00
import paho.mqtt.client as mqtt
2022-03-07 16:57:32 +08:00
from biopro.text import *
2022-02-07 20:27:30 +08:00
from .task import Task
_RUNTIME_COMPILE = False
def json_stringify(o: Any) -> str:
return _json_stringify(o, separators=(',', ':'))
class TaskManager():
2022-04-17 23:05:21 +08:00
def __init__(self, task_list):
2022-02-12 00:21:27 +08:00
self._task_list = []
2022-04-16 10:50:37 +08:00
self._next_task = []
self._prev_task = None
self._running_task = None
2022-02-17 20:35:36 +08:00
2022-04-16 10:50:37 +08:00
self.load_task_list(task_list)
2022-02-07 20:27:30 +08:00
# self.set_running_task(self._task_list[0])
# self._running_task.run()
self._next_task.append(self._task_list[0])
2022-04-16 10:50:37 +08:00
@property
def task_list(self):
return self._task_list
2022-02-25 20:54:58 +08:00
@property
def export_task_list(self):
return [d.as_json() for d in self._task_list]
2022-04-16 10:50:37 +08:00
@property
def prev_task(self):
return self._prev_task
@property
def running_task(self):
return self._running_task
@property
def next_task(self):
return self._next_task
2022-02-07 20:27:30 +08:00
2022-04-16 10:50:37 +08:00
@property
def check_list(self):
return [self._running_task, *self._next_task]
@property
def check_list(self):
return [self._running_task, *self._next_task]
def load_task_list(self, task_list):
for task in task_list:
2022-04-17 23:05:21 +08:00
task = Task(task)
2022-04-16 10:50:37 +08:00
self._task_list.append(task)
2022-08-16 11:34:47 +08:00
# original version
""" def set_running_task(self, task):
2022-04-16 10:50:37 +08:00
try:
2022-04-17 23:05:21 +08:00
# if there is task running & same task active ,then reject
2022-04-16 10:50:37 +08:00
if self._running_task != None and self._running_task.uuid == task.uuid:
return False
2022-02-17 20:35:36 +08:00
2022-04-17 23:05:21 +08:00
# save running task
2022-04-16 10:50:37 +08:00
self._prev_task = self._running_task
2022-04-17 23:05:21 +08:00
# clear next task list
self._next_task.clear()
2022-04-16 10:50:37 +08:00
self._running_task = task
2022-04-17 23:05:21 +08:00
self._running_task.run()
2022-04-16 10:50:37 +08:00
if self._prev_task != None:
2022-04-17 23:05:21 +08:00
# if previous task is still running, then need to close
2022-04-16 10:50:37 +08:00
if self._prev_task.status == 1:
self._prev_task.stop()
print('prev', 'run', self._prev_task.name, self._running_task.name)
2022-02-17 20:35:36 +08:00
2022-04-16 10:50:37 +08:00
for task_uuid in self._running_task.next:
_task = next((task for task in self._task_list if task.uuid == task_uuid), None)
if _task != None:
self._next_task.append(_task)
2022-08-16 11:34:47 +08:00
except RuntimeError as e:
print(e) """
def set_running_task(self, task):
try:
# if there is task running & same task active ,then reject
if self._running_task != None and self._running_task.uuid == task.uuid:
# print('set_running_task return false: ', self._running_task.name)
return False
# save running task
self._prev_task = self._running_task
# clear next task list
self._next_task.clear()
self._running_task = task
self._running_task.run()
if self._prev_task != None:
# if previous task is still running, then need to close
if self._prev_task.status == 1:
self._prev_task.stop()
print('prev', 'run', self._prev_task.name, self._running_task.name)
# print(f'!!@#!set_running_task\n\n\n{task._cycle_count}\n{task._cycle}\n\n\n')
2022-08-17 11:50:22 +08:00
if task._cycle_count < task._cycle - 1:
2022-08-16 11:34:47 +08:00
task._cycle_count += 1
2022-08-18 17:39:59 +08:00
# use uuid to get the cycle next task
cycle_target = [_task_next for _task_next in self._task_list if _task_next.uuid == task._cycle_next_uuid]
# cycle_target = self._task_list[task._cycle_next - 1] # original use index version
cycle_target[0].reset()
self._next_task.append(cycle_target[0])
2022-08-16 11:34:47 +08:00
else:
task._cycle_count = 0
for task_uuid in self._running_task.next:
_task = next((task for task in self._task_list if task.uuid == task_uuid), None)
if _task != None:
_task.reset()
2022-08-18 17:51:51 +08:00
self._next_task.append(_task)
2022-04-16 10:50:37 +08:00
except RuntimeError as e:
2022-03-02 18:13:02 +08:00
print(e)
2022-04-16 10:50:37 +08:00
def get_task(self, task_id):
return self._task_list[task_id]