我一直在处理清单问题。 对于将任务队列实现为列表的程序。该列表由程序中的其他进程以及外部各方操纵。 该列表应该用于跟踪已添加的任务,并定期检查它们是否已过期。从理论上讲,程序中的其他点应调用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