TaskController.py 2.4 KB
# coding=utf-8
#author:        4N
#createtime:    2021/12/2
#email:         nheweijun@sina.com

from app.modules.data.models import Task
from app.util.component.StructurePrint import StructurePrint
import configure
import time
from app.util.component.PGUtil import PGUtil

class TaskController:
    '''
    此类是面向切面的类,控制各种任务是否可以进入执行状态
    '''

    @classmethod
    def pass_check(cls,sys_session,task_guid):

        # 任务类型
        # 1:入库任务
        # 2:抽稀任务
        # 3:数据库刷新任务
        # 4:数据下载任务
        # 5:影像金字塔任务

        task = sys_session.query(Task).filter_by(guid=task_guid).one_or_none()

        check = True
        if task.task_type==1:
            #控制正在运行的任务数量
            running_count = sys_session.query(Task).filter(Task.state == 2).filter(Task.task_type == 1).count()
            first_task = sys_session.query(Task).filter(Task.state == 0).filter(Task.task_type == 1).order_by(Task.create_time).first()
            if (running_count >= configure.entry_data_thread) or (not first_task.guid.__eq__(task_guid)):
                StructurePrint().print("等待入库")
                check = False
        if task.task_type==2:
            running_count = sys_session.query(Task).filter(Task.state == 2).filter(Task.task_type == 2).count()
            first_task = sys_session.query(Task).filter(Task.state == 0).filter(Task.task_type == 2).order_by(Task.create_time).first()
            if (running_count >= configure.entry_data_thread) or (not first_task.guid.__eq__(task_guid)):
                StructurePrint().print("等待精化")
                check = False
        if task.task_type==3:
            pass
        if task.task_type==4:
            pass
        if task.task_type==5:
            pass

        return check

    @classmethod
    def wait(cls,task_guid):
        sys_session= PGUtil.get_db_session(configure.SQLALCHEMY_DATABASE_URI)
        #三秒检测一次是否可以执行任务
        wait_time = 0
        while not cls.pass_check(sys_session,task_guid):
            time.sleep(3)
            wait_time += 3
            if wait_time > 21600:
                try:
                    sys_session.close()
                except Exception as e:
                    pass
                raise Exception("任务等待超时")
        sys_session.close()