2009-11-09 4 views
52

Я ищу простой процесс на основе параллельной карты для питона, то есть функцияЕсть ли простая параллельная карта на основе процессов для python?

parmap(function,[data]) 

, что будет работать функцию на каждый элементе [данные] на другой процессе (ну, на другом core, но AFAIK, единственный способ запустить материал на разных ядрах на python - запустить несколько интерпретаторов) и вернуть список результатов.

Что-то вроде этого существует? Я хотел бы что-то простой, поэтому простой модуль был бы приятным. Конечно, если нет такого понятия не существует, я буду останавливаться на большую библиотеку: -/

ответ

93

Я кажется, что вам нужно, это map method in multiprocessing.Pool():

map(func, iterable[, chunksize])

A parallel equivalent of the map() built-in function (it supports only 
one iterable argument though). It blocks till the result is ready. 

This method chops the iterable into a number of chunks which it submits to the 
process pool as separate tasks. The (approximate) size of these chunks can be 
specified by setting chunksize to a positive integ 

Например, если вы хотите, чтобы отобразить эту функцию :

def f(x): 
    return x**2 

в диапазоне (10), вы можете сделать это с помощью встроенной функции карты():

map(f, range(10)) 

или с использованием метода multiprocessing.Poll() object map():

import multiprocessing 
pool = multiprocessing.Pool() 
print pool.map(f, range(10)) 
+0

Большое спасибо за подробный ответ! –

+4

Если вы вызываете это из долгоживущей программы, обязательно вызовите 'pool.close' (в идеале, в блоке' finally' объекта 'try/finally'). В противном случае пул может не очистить дочерние процессы, и вы можете закончить процессы зомби. См. Http://bugs.python.org/issue19675 – rogueleaderr

+2

@rogueleaderr Не было бы более идиоматично использовать 'with'? – CodeMonkey