С тех пор, как этот вопрос был задан в 2010 году, произошло реальное упрощение того, как сделать простую многопоточность с python с map и pool *. * 1009
Приведенный ниже код взят из статьи / поста в блоге, который вы обязательно должны проверить (без принадлежности) - Параллельность в одной строке:
Лучшая модель для повседневных задач . Я подведу итог ниже - это всего лишь несколько строк кода:
from multiprocessing.dummy import Pool as ThreadPool
pool = ThreadPool(4)
results = pool.map(my_function, my_array)
Какая многопоточная версия:
results = []
for item in my_array:
results.append(my_function(item))
Описание
Map - это классная маленькая функция и ключ к легкому внедрению параллелизма в ваш код Python. Для тех, кто незнаком, map - это что-то из функциональных языков, таких как Lisp. Это функция, которая отображает другую функцию в последовательности.
Map обрабатывает для нас итерации последовательности, применяет функцию и сохраняет все результаты в удобном списке в конце.
Осуществление
Параллельные версии функции map предоставляются двумя библиотеками: многопроцессорность, а также ее малоизвестный, но не менее фантастический шаг потомка: multiprocessing.dummy.
multiprocessing.dummy
- это то же самое, что и многопроцессорный модуль, , но вместо него используются потоки ( важное отличие - использовать несколько процессов для задач с интенсивным использованием ЦП; потоки для ( и во время) IO ):
multiprocessing.dummy копирует API многопроцессорной обработки, но является не более чем оболочкой для модуля потоков.
import urllib2
from multiprocessing.dummy import Pool as ThreadPool
urls = [
'http://www.python.org',
'http://www.python.org/about/',
'http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html',
'http://www.python.org/doc/',
'http://www.python.org/download/',
'http://www.python.org/getit/',
'http://www.python.org/community/',
'https://wiki.python.org/moin/',
]
# make the Pool of workers
pool = ThreadPool(4)
# open the urls in their own threads
# and return the results
results = pool.map(urllib2.urlopen, urls)
# close the pool and wait for the work to finish
pool.close()
pool.join()
И результаты расчета времени:
Single thread: 14.4 seconds
4 Pool: 3.1 seconds
8 Pool: 1.4 seconds
13 Pool: 1.3 seconds
Передача нескольких аргументов (работает так только в Python 3.3 и более поздних версиях ):
Чтобы передать несколько массивов:
results = pool.starmap(function, zip(list_a, list_b))
или передать константу и массив:
results = pool.starmap(function, zip(itertools.repeat(constant), list_a))
Если вы используете более раннюю версию Python, вы можете передать несколько аргументов через этот обходной путь .
(спасибо user136036 за полезный комментарий)