Проблема многопоточности для производителя - PullRequest
0 голосов
/ 25 апреля 2018

У меня проблемы с реализацией следующей схемы в многопоточности:

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 не опустеют, чтобы начать заполнять его снова.

Кажется, я не могу найти лучший способделать такую ​​схему, не слишком больно!Любая идея ?(я не могу использовать многопроцессорность, потому что мне нужна общая память, и мои вычисления не полностью связаны с процессором, поэтому я бы очень много выиграл от этого)!

Спасибо!

...