我在多线程中实现以下方案时遇到问题:
class OneThread(threading.Thread):
def __init__(self, eval_queue, result_queue):
threading.Thread.__init__(self)
self.eval_queue = eval_queue
self.result_queue = result_queue
def run(self):
while work_left:
while (len(self.eval_queue.values()) < some_const or \
len(self.result_queue.values()) > 0):
# wait for eval queue to be full and result_queue
# to be empty
# fill result_queue while emptying eval_queue
class ManyThread(threading.Thread):
def __init__(self, eval_queue, result_queue, thread_id):
threading.Thread.__init__(self)
self.result_queue = result_queue
self.eval_queue = eval_queue
def run(self):
while len(self.eval_queue.values()) < some_const and \
len(self.result_queue.values()) == 0:
# wait for eval_queue to not be full and
# for result queue to be empty
# fill eval_queue
# wait until result_queue is full
# use result_queue while emptying it
eval_queue = {}
result_queue = {}
evaluator = OneThread(eval_queue, result_queue)
evaluator.start()
for i in range(some_range):
eval_queue.clear()
result_queue.clear()
for j in range(some_range):
threads.append(ManyThread(eval_queue, result_queue))
threads[-1].start()
for thread in threads:
thread.join()
evaluator.join()
我已经尝试过使用条件,但它在代码中也变得混乱 在我的脑中。主要目标是在一个线程上有一个评估器,它检查eval_queue是否已满并且result_queue是否为空。如果是,则求值程序线程对eval_queue执行某些操作,并在清空eval_queue时使用结果填充result_queue。相应的线程正在等待,直到result_queue被填充,以便在清空时使用它,并等待result_queue为空以开始再次填充它。
我似乎无法找到一种更好的方法来做这种方案而不会太痛苦!任何的想法 ? (不能使用多处理,因为我需要共享内存,而且我的计算并不完全受CPU控制,因此我可以通过这样做获得很多)!
谢谢!