task_kill.py 2.6 KB
# coding=utf-8
#author:        4N
#createtime:    2020/9/4
#email:         nheweijun@sina.com

from ..models import db,Task,Table,InsertingLayerName

from app.modules.service.models import Image
from app.util.component.ApiTemplate import ApiTemplate
from app.util.component.StructuredPrint import StructurePrint
import os
import signal
import platform
import json

class Api(ApiTemplate):
    api_name = "停止任务"
    def para_check(self):
        pass

    def process(self):
        res = {}
        try:
            task_guid = self.para.get("task_guid")
            task = Task.query.filter_by(guid=task_guid).one_or_none()
            pid = task.task_pid
            try:
                if platform.system().lower().__contains__("windows"):
                    exec_result = os.popen('taskkill.exe /pid:' + str(pid))

                else:
                    #分布式下,很难吧,还需要记录机器,分布式是不可行的
                    os.kill(pid,signal.SIGILL)
            except Exception as e:
                StructurePrint.print("Kill task 失败")
                raise e

            #处理kill任务后的事情
            self.fix_task(task)
            res["msg"] = "Kill成功!"
            res["result"] = True
        except Exception as e:
            db.session.rollback()
            raise e
        return res


    def fix_task(self,task):

        if task.task_type==1:
            ilns = InsertingLayerName.query.filter_by(task_guid=task.guid).all()
            for iln in ilns:
                db.session.delete(iln)

        if task.task_type==2:
            table = Table.query.filter_by(guid=task.table_guid).one_or_none()
            if len(table.relate_table_vacuates.all())>0:
                Table.query.filter_by(guid=task.table_guid).update({"is_vacuate":1})
            else:
                Table.query.filter_by(guid=task.table_guid).update({"is_vacuate": 0})

        if task.task_type==3:
            pass
        if task.task_type==4:
            pass
        if task.task_type==5:
            Image.query.filter_by(guid=task.parameter).update({"has_pyramid":0})

        Task.query.filter_by(guid=task.guid).update({"state":-1})
        db.session.commit()
        return None

    api_doc = {
        "tags": ["任务接口"],
        "parameters": [
            {"name": "task_guid",
             "in": "formData",
             "type": "string"},
        ],
        "responses": {
            200: {
                "schema": {
                    "properties": {
                    }
                }
            }
        }
    }