예제 #1
0
    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
예제 #2
0
    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
        }