Пример многопроцессорности Python никогда не заканчивается, когда набор данных слишком велик

В вашем примере есть четыре класса и два селектора:

.container_12 .grid_6,
.container_16 .grid_8 {
    width: 460px;
}

Таким образом, .container_12 и .grid_6 - оба класса, но правило width: 460px применяется только к элементам, которые имеют .grid_6, которые являются потомками элемента, имеющего класс .container_16.

Например:

<div class="container_16">
<p class=".grid_6">This has a width of 480px.</p>
<p>This has an unknown width.</p>
</div>
0
задан Jon 13 July 2018 в 20:29
поделиться

1 ответ

Основная проблема заключается в следующем:

    self.__start_thread(p)
    self.__join_threads(p)
    results = self.__extract_data(q)

Вы запускаете своих работников, которые пытаются помещать что-то в очередь, затем присоединяются к работникам и только после этого вы начинаете возвращать данные из очереди. Однако рабочие могут выйти только после того, как все данные будут сброшены в базовую трубу и будут блокироваться при выходе в противном случае. Объединение процессов, заблокированных таким образом, прежде чем начинать извлекать элементы из канала, может привести к тупиковой ситуации.

Возможно, вам стоит заглянуть в multiprocessing.Pool , как то, что вы пытаетесь реализовать является некоторой функцией map() . Ваш пример мог бы более элегантно переписать что-то вроде этого:

from multiprocessing import Pool
import string
import random


def func(name):
    return 'Test-' + name

def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
    return ''.join(random.choice(chars) for _ in range(size))

if __name__ == "__main__":
    random.seed(1234)
    data_size = 5000
    num_proc = 2
    test_list = [id_generator() for i in range(data_size)]
    with Pool(num_proc) as pool:
        result = pool.map(func, test_list)
    print(result)
2
ответ дан mata 17 August 2018 в 12:09
поделиться
Другие вопросы по тегам:

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