def run(self): while 1: # sleep for decrease cpu usage sleep(0.01) QCoreApplication.processEvents() from_db = False if self.running_tasks.__len__() >= self.limit(): continue try: if self.items: from_db = True item = self.items.pop() else: item = self.queue.get() # type: RequestObject if item: if not from_db: task_model = TaskModel() task_model.route = item.route task_model.process_id = item.process_id task_model.status = constants.STATUS_RUNNING task_model.data = item.data task_model.call_back = item.call_back task_model.token = item.token task_model.module_version = item.module_version task_model.queue_name = self.queue_name task_model.save() else: task_model = item task = Task(task_model) if task.instance_module: task.instance_module.task_finished.connect(self.__task_finished) task.setAutoDelete(True) self.running_tasks.update({item.process_id: task}) # check cancel or pause request before start self.apply_action_by_pid(task, item.process_id) self.pool.start(task) else: # TODO: set error alarm ApiLogging.error('problem running task') except Exception as e: ApiLogging.error('process exception' + str(e)) # TODO: set error alarm continue
def cancel(data): params = Command.__get_data(data) if params: if params.get('process_id'): tag = params.get('process_id') try: # check if this process_id is running task_exist = TaskModel.get(TaskModel.process_id == tag) except Exception: task_exist = False queue_exist = PGQ.preview(tag) # check if this process_id is on queue or running if queue_exist or task_exist: try: # check if any other command submitted action = ActionModel.get(ActionModel.process_id == tag) except: action = ActionModel() action.process_id = params.get('process_id') action.action = constants.STATUS_CANCEL if queue_exist: action.status = constants.STATUS_SUCCESS action.save() if queue_exist: item = PGQ.get_by_tag( tag ) # get from queue and remove item, and save in task_model task_model = TaskModel() # route, call_back, token, process_id, data, module_version error = { 'code': CancelExecutionError.get_code(), 'message': 'task canceled by user!' } task_model.route = item.data.route task_model.process_id = item.data.process_id task_model.status = constants.STATUS_FAILED task_model.token = item.data.token task_model.module_version = item.data.module_version task_model.data = item.data.data task_model.call_back = item.data.call_back task_model.delivery = constants.STATUS_NEW task_model.queue_name = item.name task_model.response_data = { 'data': to_json({}), 'error': to_json(error), 'status': constants.STATUS_ERROR, 'token': item.data.token, 'process_id': item.data.process_id } try: task_model.save() except Exception: raise DatabaseError('can not access database') Command.send_signal( ['process_h.py', 'process_m.py', 'process_l.py']) return { 'data': 'cancel request received!', 'status': constants.STATUS_PENDING } else: return { 'data': 'process_id not found', 'status': constants.STATUS_ERROR } else: return { 'data': 'process_id keyword not found', 'status': constants.STATUS_ERROR } return { 'data': 'format or process id is wrong', 'status': constants.STATUS_ERROR }