2016-10-06 2 views
1

Win 7, x64, Python 2.7.12Возврат нескольких списков из процессов pool.map?

В следующем коде я настраиваю некоторые процессы пула, чтобы выполнить тривиальное умножение с помощью метода multiprocessing.Pool.map(). Выходные данные собираются в List_1.

ПРИМЕЧАНИЕ: это упрощенное упрощение моего фактического кода. В реальном приложении задействовано несколько списков, все огромные.

import multiprocessing 
import numpy as np 

def createLists(branches): 

    firstList = branches[:] * node 

    return firstList 


def init_process(lNodes): 

    global node 
    node = lNodes 
    print 'Starting', multiprocessing.current_process().name 


if __name__ == '__main__': 

    mgr = multiprocessing.Manager() 
    nodes = mgr.list() 
    pool_size = multiprocessing.cpu_count() 

    branches = [i for i in range(1, 21)] 
    lNodes = 10 
    splitBranches = np.array_split(branches, int(len(branches)/pool_size)) 

    pool = multiprocessing.Pool(processes=pool_size, initializer=init_process, initargs=[lNodes]) 
    myList_1 = pool.map(createLists, splitBranches) 

    pool.close() 
    pool.join() 

Я теперь добавить дополнительный расчет в createLists() & пытаются передать обратно в обоих списках.

import multiprocessing 
import numpy as np 

def createLists(branches): 

    firstList = branches[:] * node 
    secondList = branches[:] * node * 2 

    return firstList, secondList 


def init_process(lNodes): 
    global node 
    node = lNodes 
    print 'Starting', multiprocessing.current_process().name 


if __name__ == '__main__': 

    mgr = multiprocessing.Manager() 
    nodes = mgr.list() 
    pool_size = multiprocessing.cpu_count() 

    branches = [i for i in range(1, 21)] 
    lNodes = 10 
    splitBranches = np.array_split(branches, int(len(branches)/pool_size)) 

    pool = multiprocessing.Pool(processes=pool_size, initializer=init_process, initargs=[lNodes]) 
    myList_1, myList_2 = pool.map(createLists, splitBranches) 

    pool.close() 
    pool.join() 

Это поднимает последующие ошибки & отслеживающий ..

Traceback (most recent call last): 

    File "<ipython-input-6-ff188034c708>", line 1, in <module> 
    runfile('C:/Users/nr16508/Local Documents/Inter Trab Angle/Parallel/scratchpad.py', wdir='C:/Users/nr16508/Local Documents/Inter Trab Angle/Parallel') 

    File "C:\Users\nr16508\AppData\Local\Continuum\Anaconda2\lib\site-packages\spyder\utils\site\sitecustomize.py", line 866, in runfile 
    execfile(filename, namespace) 

    File "C:\Users\nr16508\AppData\Local\Continuum\Anaconda2\lib\site-packages\spyder\utils\site\sitecustomize.py", line 87, in execfile 
    exec(compile(scripttext, filename, 'exec'), glob, loc) 

    File "C:/Users/nr16508/Local Documents/Inter Trab Angle/Parallel/scratchpad.py", line 36, in <module> 
    myList_1, myList_2 = pool.map(createLists, splitBranches) 

ValueError: too many values to unpack 

Когда я попытался поставить оба списка в один, чтобы пройти обратно то ...

return [firstList, secondList] 
...... 
myList = pool.map(createLists, splitBranches) 

... выход слишком смещен для дальнейшей обработки.

Есть ли способ сбора более одного списка из объединенных процессов?

ответ

1

Этот вопрос не имеет ничего общего с многопроцессорной или потоковой передачей. Это просто о том, как распаковать списки, что можно сделать с помощью стандартного zip(*...) идиомы.

myList_1, myList_2 = zip(*pool.map(createLists, splitBranches)) 
Смежные вопросы