mirror of https://github.com/dnomd343/ProxyC
				
				
			
				 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