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)
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)
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)
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)
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)
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")