В вашем примере есть четыре класса и два селектора:
.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>
Основная проблема заключается в следующем:
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)