Форум сайта python.su
0
Я пытаюсь разветвить вычисления факториала используя multiprocessing. Я новичок в этом, но начитавшись статей, мне показалось, использование Pool может решить мою проблему. Хотелось бы задавать конечное число worker'ов, которые будут параллелить вычисление. Проблема в том, что когда я думал, что написал все правильно, оказалось, что это совсем не так. По времени практически нет выигрыша относительно однопроцессорного решения. Что не так с моим кодом? Может стоит использовать fork()? Но в этом случае не до конца понимаю, как задавать число worker'ов.
from multiprocessing import Pool import time def factorial(number): total = 1 while number != 1: total = total * number number = number - 1 print(total) if __name__ == '__main__': time_start = time.time() workers_count = 4 pool = Pool(processes=workers_count) # start 4 worker processes res = pool.apply_async(factorial, (75000,)) # evaluate res.get() time_end = time.time() print("time with 4 multiprocessing: " + str(time_end - time_start)) time_start = time.time() factorial(75000) time_end = time.time() print("time as usual: " + str(time_end - time_start))
Отредактировано AndyWarhol (Сен. 6, 2018 23:26:18)
Офлайн
857
Вызов print() из функции убери, результаты нужно класть в неблокирующую очередь. И вообще у тебя функция неправильная. Если подать отрицательное число, она повиснет.
Так что зря ты начала с параллельных программ, там нюансов куча. Делая параллельные программы, нужно понимать, как работает каждая операция под капотом. Также нужно знать, как работает интерпретатор внутри.
Отредактировано py.user.next (Сен. 7, 2018 00:40:42)
Офлайн
186
Вот пример ускорения вычисления множества Мандельброта почти в 2 раза при помощи multiprocessing-а. Ну и не надо забывать что в процессах должны работать реально тяжёлые задачи, иначе в место ускорения можно получить деградацию.
import time from multiprocessing import Pool def mandelbrot(cr, ci): strok, zi, zr, = "", 0.0, 0.0 for i in xrange(5000): zr2 = zr * zr zi2 = zi * zi if zi2 + zr2 > 16: strok += " " break zi = zr * zi * 2 + ci zr = zr2 - zi2 + cr else: strok += "*" return strok def str_mandelbrot(nk): s = [] for y in xrange(*nk): s.append("".join([ mandelbrot(y/40.0-0.5, x/40.0) for x in xrange(-39,39) ])) return "\n".join(s) t = time.time() pool = Pool(processes=2) s = pool.map(str_mandelbrot, [(-39, -20), (-20, -1), (-1, 18), (18, 39)]) pool.close() pool.join() print 'multiprocessing %.02f' % (time.time() - t) #print "\n".join(s) t = time.time() s = [] for x in [(-39, -20), (-20, -1), (-1, 18), (18, 39)]: s.append(str_mandelbrot(x)) print 'python %.02f' % (time.time() - t) print "\n".join(s)
rodegast@rodegast:~$ python ./mandelbrot.py multiprocessing 3.02 python 5.82 * * * * * *** ***** ***** *** * ********* ************* *************** ********************* ********************* ******************* ******************* ******************* ******************* *********************** ******************* ******************* ********************* ******************* ******************* ***************** *************** ************* ********* * *************** *********************** * ************************* * ***************************** * ******************************* * ********************************* *********************************** *************************************** *** ***************************************** *** ************************************************* *********************************************** ********************************************* ********************************************* *********************************************** *********************************************** *************************************************** ************************************************* ************************************************* *************************************************** *************************************************** * *************************************************** * ***** *************************************************** ***** ****** *************************************************** ****** ******* *************************************************** ******* *********************************************************************** ********* *************************************************** ********* ****** *************************************************** ****** ***** *************************************************** ***** *************************************************** *************************************************** *************************************************** *************************************************** ************************************************* ************************************************* *************************************************** *********************************************** *********************************************** ******************************************* ***************************************** ********************************************* **** ****************** ****************** **** *** **************** **************** *** ************** ************** *********** *********** ** * *** *** * ** * * * *
Отредактировано Rodegast (Сен. 10, 2018 16:30:36)
Офлайн