mirror of https://github.com/dnomd343/ProxyC
dnomd343
2 years ago
3 changed files with 145 additions and 2 deletions
@ -0,0 +1,87 @@ |
|||||
|
#!/usr/bin/env python3 |
||||
|
# -*- coding: utf-8 -*- |
||||
|
|
||||
|
import copy |
||||
|
from Basis.Logger import logging |
||||
|
from Basis.Functions import genFlag |
||||
|
|
||||
|
|
||||
|
class Task(object): |
||||
|
""" Manage global check task. |
||||
|
""" |
||||
|
__tasks = {} |
||||
|
__subTasks = {} # sub task status -> loaded / running / complete |
||||
|
|
||||
|
def __init__(self): |
||||
|
logging.info('task manager start') |
||||
|
|
||||
|
def addTask(self, tasks: list) -> str: # add task to manager (multi sub tasks) |
||||
|
subTasks = {} |
||||
|
subTaskIds = [] |
||||
|
for subTask in tasks: |
||||
|
subTaskId = genFlag(length = 24) # generate sub task id (24 bytes) |
||||
|
subTaskIds.append(subTaskId) |
||||
|
subTasks[subTaskId] = { |
||||
|
'status': 'loaded', |
||||
|
'data': copy.deepcopy(subTask) |
||||
|
} |
||||
|
logging.info('add sub task %s -> %s' % (subTaskId, subTasks[subTaskId]['data'])) |
||||
|
taskId = genFlag(length = 16) # generate task id (16 bytes) |
||||
|
self.__tasks[taskId] = { # load task |
||||
|
'sub': subTaskIds |
||||
|
} |
||||
|
self.__subTasks.update(subTasks) # load sub tasks |
||||
|
logging.info('task %s loaded' % taskId) |
||||
|
return taskId |
||||
|
|
||||
|
def isTask(self, taskId: str) -> bool: # check if the task id exist |
||||
|
return taskId in self.__tasks |
||||
|
|
||||
|
def getTask(self, taskId: str) -> dict: # get task status (remove sub tasks when all completed) |
||||
|
if taskId not in self.__tasks: |
||||
|
logging.error('task id %s not found' % taskId) |
||||
|
raise RuntimeError('task id not found') |
||||
|
subList = self.__tasks[taskId]['sub'] |
||||
|
completed = 0 |
||||
|
for subTaskId in subList: |
||||
|
if self.__subTasks[subTaskId]['status'] == 'complete': # get number of completed sub task |
||||
|
completed += 1 |
||||
|
logging.debug('[%s] statistics sub task status -> %i/%i' % (taskId, completed, len(subList))) |
||||
|
if completed < len(subList): # some sub tasks are not completed |
||||
|
logging.debug('[%s] task still running' % taskId) |
||||
|
return { |
||||
|
'done': False, |
||||
|
'total': len(subList), |
||||
|
'finish': completed, |
||||
|
} |
||||
|
logging.debug('[%s] task work complete' % taskId) # all sub tasks completed |
||||
|
result = [] |
||||
|
for subTaskId in subList: |
||||
|
subTask = self.__subTasks[subTaskId] |
||||
|
self.__subTasks.pop(subTaskId) |
||||
|
result.append(subTask['data']) |
||||
|
logging.debug('release sub tasks -> %s' % result) |
||||
|
return { |
||||
|
'done': True, |
||||
|
'result': result |
||||
|
} |
||||
|
|
||||
|
def listTask(self) -> list: # get all task ids |
||||
|
return [x for x in self.__tasks] |
||||
|
|
||||
|
def popSubTask(self) -> tuple[str or None, any]: # fetch a loaded sub task |
||||
|
for subTaskId, subTask in self.__subTasks.items(): |
||||
|
if subTask['status'] != 'loaded': continue # only get loaded sub task |
||||
|
subTask['status'] = 'running' # set status as running |
||||
|
return subTaskId, copy.deepcopy(subTask['data']) |
||||
|
return None, None |
||||
|
|
||||
|
def updateSubTask(self, subTaskId: str, subTaskData: dict) -> None: # update sub task data when completed |
||||
|
if subTaskId not in self.__subTasks: |
||||
|
logging.error('sub task id %s not found' % subTaskId) |
||||
|
raise RuntimeError('sub task id not found') |
||||
|
self.__subTasks[subTaskId]['data'] = copy.deepcopy(subTaskData) |
||||
|
self.__subTasks[subTaskId]['status'] = 'complete' |
||||
|
|
||||
|
|
||||
|
Manage = Task() # global task manager |
@ -0,0 +1,56 @@ |
|||||
|
#!/usr/bin/env python3 |
||||
|
# -*- coding: utf-8 -*- |
||||
|
|
||||
|
from Basis.Manage import Manage |
||||
|
from Basis.Logger import logging |
||||
|
|
||||
|
|
||||
|
taskId_1 = Manage.addTask([ |
||||
|
{'test': 1}, |
||||
|
{'test': 2}, |
||||
|
{'test': 3}, |
||||
|
]) |
||||
|
logging.critical('task id 1 -> %s' % taskId_1) |
||||
|
|
||||
|
taskId_2 = Manage.addTask([ |
||||
|
{'demo': 1}, |
||||
|
{'demo': 2}, |
||||
|
{'demo': 3}, |
||||
|
]) |
||||
|
logging.critical('task id 2 -> %s' % taskId_2) |
||||
|
|
||||
|
logging.critical('list task -> %s' % Manage.listTask()) |
||||
|
|
||||
|
logging.critical('is task 1234 -> %s' % Manage.isTask('1234')) |
||||
|
logging.critical('is task %s -> %s' % (taskId_1, Manage.isTask(taskId_1))) |
||||
|
|
||||
|
logging.critical('get task %s -> %s' % (taskId_1, Manage.getTask(taskId_1))) |
||||
|
|
||||
|
subTaskId_1, subTask_1 = Manage.popSubTask() |
||||
|
logging.critical('pop sub task %s -> %s' % (subTaskId_1, subTask_1)) |
||||
|
subTaskId_2, subTask_2 = Manage.popSubTask() |
||||
|
logging.critical('pop sub task %s -> %s' % (subTaskId_2, subTask_2)) |
||||
|
subTaskId_3, subTask_3 = Manage.popSubTask() |
||||
|
logging.critical('pop sub task %s -> %s' % (subTaskId_3, subTask_3)) |
||||
|
|
||||
|
Manage.updateSubTask(subTaskId_3, {'test': 33}) |
||||
|
logging.critical('update sub task %s' % subTaskId_3) |
||||
|
Manage.updateSubTask(subTaskId_2, {'test': 22}) |
||||
|
logging.critical('update sub task %s' % subTaskId_2) |
||||
|
Manage.updateSubTask(subTaskId_1, {'test': 11}) |
||||
|
logging.critical('update sub task %s' % subTaskId_1) |
||||
|
|
||||
|
logging.critical('get task %s -> %s' % (taskId_1, Manage.getTask(taskId_1))) |
||||
|
|
||||
|
subTaskId_4, subTask_4 = Manage.popSubTask() |
||||
|
logging.critical('pop sub task %s -> %s' % (subTaskId_4, subTask_4)) |
||||
|
|
||||
|
Manage.updateSubTask(subTaskId_4, {'demo': 2333}) |
||||
|
logging.critical('update sub task %s' % subTaskId_4) |
||||
|
|
||||
|
logging.critical('get task %s -> %s' % (taskId_2, Manage.getTask(taskId_2))) |
||||
|
|
||||
|
logging.critical('sub task pop -> ' + str(Manage.popSubTask())) |
||||
|
logging.critical('sub task pop -> ' + str(Manage.popSubTask())) |
||||
|
logging.critical('sub task pop -> ' + str(Manage.popSubTask())) |
||||
|
|
Loading…
Reference in new issue