Olej писал(а):Подсказали
: интересная статья о параллелизме выполнения в Python -
Parallel MapReduce in Python in Ten Minutes.
Использованием
стандартного пакета (/usr/lib/python2.7) multiprocessing.
...
Но с этим нужно отдельно разбираться...
Очень любопытно!
Переделал (добавил + некоторые исправления) вот тот архив mthrs.tgz, который показывался и раньше...
Теперь это выглядит так (подробнее в архиве), т.е. значащих здесь всего 2 вызова:
Код: Выделить всё
def ncount( n ) : # тестовая CPU-загружающая функция
while n > 0 : n -= 1
...
if 'm' in mode :
print "=============== модуль multiprocessing =============="
parms = []
pool = multiprocessing.Pool( processes = thrnum, )
for n in range( thrnum ) :
parms.append( repnum )
clc = time.time()
pool.map( ncount, parms )
clc = time.time() - clc
print "время %5.2f секунд" % clc
Код: Выделить всё
bash-4.2$ python mthrs.py
число процессоров (ядер) = 2
исполнение в Python версия 2.7.3 (default, Jul 24 2012, 10:05:39)
число ветвей выполнения 2
число циклов в ветви 10000000
============ последовательное выполнение ============
время 2.89 секунд
================ параллельные потоки ================
время 3.44 секунд
=============== параллельные процессы ===============
время 1.74 секунд
=============== модуль multiprocessing ==============
время 1.81 секунд
Он ведёт аналогично как и fork() ... Теперь добавились "моды" (опция -m): значение m - multiprocessing, ... ну и те, что были раньше: s - последовательное выполнение, t - параллельные потоки, p - параллельные процессы ... это сделано чтобы можно было запустить только один тип (или несколько) выполнения, поскольку в некоторых ОС (Windows
) некоторые режимы принципиально слетают... ну и чтоб время при экспериментах не терять - можно делать так:
Код: Выделить всё
bash-4.2$ ./mthrs.py -n5000000 -mm
число процессоров (ядер) = 2
исполнение в Python версия 2.7.3 (default, Jul 24 2012, 10:05:39)
число ветвей выполнения 2
число циклов в ветви 5000000
=============== модуль multiprocessing ==============
время 0.87 секунд
Некоторые вещи (совсем посторонние) достаточно странно выглядят... например, что выполнение практически того же самого кода (print не в счёт
) в Python 3 заметно (чуть ли не в 3 раза!) длиннее, чем в Python 2 - сравните:
Код: Выделить всё
bash-4.2$ python3 mthrs3.py
число процессоров (ядер) = 2
исполнение в Python версия 3.2.3 (default, Jun 8 2012, 05:37:15)
число ветвей выполнения 2
число циклов в ветви 10000000
============ последовательное выполнение ============
время 6.48 секунд
================ параллельные потоки ================
время 8.82 секунд
=============== параллельные процессы ===============
время 3.90 секунд
=============== модуль multiprocessing ==============
время 4.02 секунд