@matweykai
Standart coder ; )

Почему зависает метод put?

Мне надо реализовать функцию параллельно на нескольких процессах. Я разделяю данные по процессам, а их результат кладу в очередь. После завершения их работы, объединяю данные в основном потоке, вытаскивая их из очереди. Но у меня зависает метод put очереди. Помогите исправить, пожалуйста

# Подсчёт элементов с помощью многопоточности
from time import process_time
from multiprocessing import Process, Queue, current_process


# Calculates matrix row
def calculate_part(params):
    p_i, q_vector = params
    return [(p_i ** 2 + q_j ** 2) ** 0.5 for q_j in q_vector]


def calculate_n_parts(n_params: list, start_index: int, end_index: int, queue: Queue):
    result = []

    for p_i, q_vector in n_params:
        result.append(calculate_part((p_i, q_vector)))
    res_obj = (start_index, end_index, *result)
    queue.put(res_obj)


def concatenate_data(queue):
    global n_el
    result = [0 for i in range(n_el)]
    while not queue.empty():
        tup = queue.get()
        result[tup[0]: tup[1]] = tup[2]

    return result


if __name__ == '__main__':
    n_el = 1000

    processes_count = 5
    process_el_count = n_el // processes_count
    matrix = [0 for i in range(n_el)]
    data_queue = Queue()

    q_vect = [(i + 11) ** 2 for i in range(n_el)]
    p_vect = [(i * 3 + 13) * 17 for i in range(n_el)]

    prepared_data = [(p_i, q_vect) for p_i in p_vect]

    t_res = []
    for index in range(0, n_el, process_el_count):
        t_res.append((prepared_data[index:index + process_el_count], index, index + process_el_count, data_queue))

    processes = [Process(target=calculate_n_parts,
                         args=tup) for tup in t_res]

    start_time = process_time()

    for process in processes:
        process.start()

    for process in processes:
        process.join()

    print(concatenate_data(data_queue))

    print(process_time() - start_time, "секунд")
  • Вопрос задан
  • 76 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Возможно, очередь переполнилась.
Простой способ это обойти: ты знаешь, сколько заданий было дано дочерним процессам. Читай ответы из очереди и считай их. Когда прочитаешь столько ответов, сколько было дано заданий - можно дальше не читать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы