2016-12-18 4 views
1

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

Это код, который я написал:

subset = #[list of proper objects] 
nthreads = 10 

def compute_distance_corcoeff(geneset, offset, q): 
    for i in range(offset, len(geneset), nthreads): 
     g1 = geneset[i] 
     dvect = [np.corrcoef(g1.expr, g2.expr)[0,1] for g2 in geneset] 
     q.put((i,dvect)) 

queue = Queue() 
processes = [] 
for off in range(nthreads): 
    processes.append(Process(target=compute_distance_corcoeff, args=(subset, off, queue))) 

for p in processes: 
    p.start() 
for p in processes: 
    p.join() 

Я затем собирать частичные результаты из очереди.

К сожалению, похоже, что ничего не происходит. Кажется, он застрял на join().

Что мне здесь не хватает?

+0

Что вы подразумеваете под «правильными объектами»? если вы помещаете операторы печати в 'compute_distance_corcoeff', чтобы проверить, действительно ли он запущен, он печатается? Может быть, это просто очень долго, насколько велика «подмножество»? –

+1

Я предлагаю вам использовать ['multiprocessing.Pool'] (https://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.pool), а затем' join() 'объект' Pool' создано. Если вы используете Windows, обязательно используйте команду 'if __name__ == '__main __:', чтобы отделить основной процесс от кода подпроцессов. – martineau

+0

возможно, '' p.close() 'отсутствует? –

ответ

1

Как объясняется в multiprocessing programming guidelines, вы должны сначала опорожнить Queue, а затем присоединиться к Process.

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

Смежные вопросы