예제 #1
0
    def dispatch(self):
        '''
        分派一个任务
        '''
        lf = open(self.__lockFile, "w")
        fcntl.flock(lf, fcntl.LOCK_EX)
        try:
            taskArrStr = ioutil.readText(self.__taskFile)
            taskArr = json.loads(taskArrStr)
            data = None
            for taskData in taskArr:
                # print(dateutil.now4Timestamp() > dateutil.timestamp(taskData["updateTime"])+5)
                if taskData.get(
                        "status", Task.STATUS_WAITING
                ) == Task.STATUS_FAILED and dateutil.now4Timestamp(
                ) > dateutil.timestamp(taskData["updateTime"]) + 5:
                    data = taskData
                    break

                elif taskData.get("status",
                                  Task.STATUS_WAITING) == Task.STATUS_WAITING:
                    data = taskData
                    break

            if data is not None:
                logger.info("dispatcher as task, taskId:%s", data["id"])
                taskData["status"] = Task.STATUS_RUNNING
                taskData["updateTime"] = dateutil.now()
                ioutil.writeText(self.__taskFile, json.dumps(taskArr))
                return loadTask(self, data)
            else:
                return None
        finally:
            fcntl.flock(lf, fcntl.LOCK_UN)
예제 #2
0
 def update(self, task):
     lf = open(self.__lockFile, "w")
     fcntl.flock(lf, fcntl.LOCK_EX)
     try:
         taskArrStr = ioutil.readText(self.__taskFile)
         taskArr = json.loads(taskArrStr)
         for taskData in taskArr:
             if task.id == taskData["id"]:
                 task.data(taskData)
                 break
         ioutil.writeText(self.__taskFile, json.dumps(taskArr))
     finally:
         fcntl.flock(lf, fcntl.LOCK_UN)
예제 #3
0
    def genId(self):
        lf = open(self.__lockFile, "r+")
        fcntl.flock(lf, fcntl.LOCK_EX)
        try:

            idStr = ioutil.readText(self.__idFile)
            if idStr == None or idStr == "":
                idStr = "0"
            id = int(idStr) + 1
            ioutil.writeText(self.__idFile, str(id))
            return id
        finally:
            fcntl.flock(lf, fcntl.LOCK_UN)
예제 #4
0
 def insert(self, task):
     '''
     插入一个新的任务
     '''
     task.id = self.genId()
     lf = open(self.__lockFile, "w")
     fcntl.flock(lf, fcntl.LOCK_EX)
     try:
         taskArrStr = ioutil.readText(self.__taskFile)
         taskArr = json.loads(taskArrStr)
         taskArr.append(task.data())
         taskArrStr = json.dumps(taskArr)
         ioutil.writeText(self.__taskFile, taskArrStr)
     finally:
         fcntl.flock(lf, fcntl.LOCK_UN)
예제 #5
0
    def archive(self, task):
        lf = open(self.__lockFile, "w")
        fcntl.flock(lf, fcntl.LOCK_EX)
        try:
            taskArrStr = ioutil.readText(self.__taskFile)
            taskArr = json.loads(taskArrStr)
            data = None
            for index in range(len(taskArr)):
                if task.id == taskArr[index]["id"]:
                    data = taskArr.pop(index)
                    break
            ioutil.writeText(self.__taskFile, json.dumps(taskArr))

            if data is not None:
                archiveArrStr = ioutil.readText(self.__archiveFile)
                archiveArr = json.loads(archiveArrStr)
                archiveArr.append(data)
                ioutil.writeText(self.__archiveFile, json.dumps(archiveArr))

        finally:
            fcntl.flock(lf, fcntl.LOCK_UN)
예제 #6
0
    def __init__(self, dir=None):
        '''
        dir: 任务文件的保存路径
        '''
        self.dir = dir
        if not path.exists(self.dir):
            os.makedirs(self.dir)

        self.__idFile = path.join(self.dir, "id")
        if not path.exists(self.__idFile):
            ioutil.writeText(self.__idFile, "0")

        self.__taskFile = path.join(self.dir, "task")
        if not path.exists(self.__taskFile):
            ioutil.writeText(self.__taskFile, "[]")

        self.__archiveFile = path.join(self.dir, "archive")
        if not path.exists(self.__archiveFile):
            ioutil.writeText(self.__archiveFile, "[]")

        self.__lockFile = path.join(self.dir, "lock")
        if not path.exists(self.__lockFile):
            ioutil.writeText(self.__lockFile, "lock")