添加到列表的元素不保留吗?

时间:2019-07-17 06:18:48

标签: python python-3.x multithreading

我一直在处理清单问题。 对于将任务队列实现为列表的程序。该列表由程序中的其他进程以及外部各方操纵。 该列表应该用于跟踪已添加的任务,并定期检查它们是否已过期。从理论上讲,程序中的其他点应调用Give_task,应处理任务,然后在程序中的另一点,应在包含过期列表之前调用任务列表上的remove函数。

为了进行调试,我手动在列表中添加了一些字符串并将其追加,然后连续打印出其中包含的内容。 打印线程仅连续两次打印["test_value", "test_value_2"]。 当调用Give_task方法时,我可以看到将test_values33和44添加到了

的队列中。
 self.logger.log("[CustomTaskBroker] Task given. Task is '{0}'. Added to queue: '{1}'".format(task_obj.cast_type, self.task_queue))

但是,在此之后,这些值似乎又消失了(以及实际添加的任务),并且print_thread继续打印相同的["test_value", "test_value_2"]。稍后在调用remove_task函数时,它也只会看到该列表。

代码在下面。我觉得我缺少一些琐碎的东西...

class CustomTaskBroker(TaskBroker):


    def __init__(self):
        self.logger = Logger("CustomTaskBroker")

        self.task_signal = threading.Event()
        self.task_queue = ['test_value']
        self.task_monitor_thread = threading.Thread(name = "Task Monitor Thread", target = self.task_queue_monitor, args = [self.task_signal, self.task_queue])
        self.task_monitor_thread.start()
        self.task_queue_thread = threading.Thread(name = "task_queue_thread", target = self.print_task_queue, args = [self.task_queue])
        self.task_queue_thread.start()
        self.task_queue.append('test_value_2')

    def print_task_queue(self, task_queue):
        while True:
            time.sleep(3)
            self.logger.log("[CustomTaskBroker] Printing given queue: '{0}'".format(task_queue))
            self.logger.log("[CustomTaskBroker] Printing self queue: '{0}'".format(self.task_queue))

    def give_task(self, task_obj):
        try:
            self.handle_callback_requirements(task_obj)
            self.add_task_to_queue(task_obj)
            self.task_queue.append('test_value_44')

            self.logger.log("[CustomTaskBroker] Task given. Task is '{0}'. Added to queue: '{1}'".format(task_obj.cast_type, self.task_queue))
            if task_obj.cast_type is "anycast":
                self.message_queue.queue.lpush('changes_' + task_obj.tenant + "_" + "common" +':process', task_obj.as_json_string())
            else:
                self.message_queue.publish(task_obj)
            self.task_queue.append('test_value_55')
        except Exception as e:
            self.logger.error("[CustomTaskBroker] invalid task received. Error message '{0}'", e)

    def add_task_to_queue(self, task_obj):
        self.task_queue.append({"task": task_obj, "id": task_obj.id, "start_time": get_absolute_time_seconds(), "wait_time": task_obj.wait_time})
        self.task_signal.set()
        self.task_queue.append('test_value_33')

    def remove_task_from_queue(self, task):
        if task.type == "result":
            self.logger.log("[CustomTaskBroker] Task is ResultTask, removing the source_task '{0}' from task_queue '{1}'".format(task.source_task, self.task_queue))
            id_task_to_remove = ast.literal_eval(task.source_task)["id"]
        else:     
            id_task_to_remove = task.id      
            self.logger.log("[CustomTaskBroker] Task is id '{0}', removing from task_queue '{1}'".format(id_task_to_remove, self.task_queue))
        for i in range(len(self.task_queue)):
            if self.task_queue[i]["id"] == id_task_to_remove:
                self.task_queue.pop(i)
                return
        self.logger.error("[CustomTaskBroker] Tried to remove task with id '{0}' but not found!".format(id_task_to_remove))

    def handle_callback_requirements(self, task_obj):
        if task_obj.return_channel is None:
            task_obj.return_channel = get_hostname()

    #Run in thread
    def task_queue_monitor(self, task_signal, task_queue):
        try:
            while True:
                earliest_task_timer = self.determine_wait_time(task_queue)
                self.logger.log("[CustomTaskBroker] Monitor_threads, len task_queue is '{0}'. Waiting until task added or wait_time '{1}'".format(len(task_queue), earliest_task_timer["wait_time"]))

                task_signal.wait(timeout = earliest_task_timer["wait_time"])

                self.logger.log("[CustomTaskBroker] Wait time expired or new task added. Checking if tasks expired")
                earliest_task_timer = self.determine_wait_time(task_queue)
                if earliest_task_timer["wait_time"] < 0:
                    self.logger.log("[CustomTaskBroker] Wait time expired. Checking if the waiting task is still in queue")
                    if earliest_task_timer["task_id"] in [ task["id"] for task in task_queue]:
                        raise Exception("We have an expired Task! Rollback")
                        #TODO implement rollback
        except Exception as e:
            self.logger.error("[CustomTaskBroker] Monitor threads encountered an issue. Exception: '{0}'".format(e))

    #Run in thread
    def determine_wait_time(self, task_queue):
        if len(task_queue) == 0:
            earliest_task_timer = { "id" : "None", "wait_time" : None} #block indefinitely
        else:
            list_of_wait_time_tasks = [(task["id"], task["wait_time"] - (get_absolute_time_seconds() - task["start_time"])) for task in task_queue]
            self.logger.log("[CustomTaskBroker] list_of_wait_time_tasks: '{0}'".format(list_of_wait_time_tasks))
            earliest_task_tuple = min(list_of_wait_time_tasks, key= lambda n: n[1])
            earliest_task_timer =  { "id" : earliest_task_tuple[0], "wait_time" : earliest_task_tuple[1]}
        self.logger.log("[CustomTaskBroker] determine_wait_time determined earliest_task_timer: '{0}'".format(earliest_task_timer))
        return earliest_task_timer

0 个答案:

没有答案
相关问题