У меня проблемы с реализацией следующей схемы в многопоточности:
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 и заполняет result_queue результатами при очистке eval_queue.Соответствующие потоки ждут, пока заполнится result_queue, чтобы использовать его во время очистки, а также ждут, пока result_queue не опустеют, чтобы начать заполнять его снова.
Кажется, я не могу найти лучший способделать такую схему, не слишком больно!Любая идея ?(я не могу использовать многопроцессорность, потому что мне нужна общая память, и мои вычисления не полностью связаны с процессором, поэтому я бы очень много выиграл от этого)!
Спасибо!