Найти - Пользователи
Полная версия: Распараллелить процесс (нет эффекта)
Начало » Python для новичков » Распараллелить процесс (нет эффекта)
1
AndyWarhol
Я пытаюсь разветвить вычисления факториала используя 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))
py.user.next
Вызов print() из функции убери, результаты нужно класть в неблокирующую очередь. И вообще у тебя функция неправильная. Если подать отрицательное число, она повиснет.

Так что зря ты начала с параллельных программ, там нюансов куча. Делая параллельные программы, нужно понимать, как работает каждая операция под капотом. Также нужно знать, как работает интерпретатор внутри.
Rodegast
Вот пример ускорения вычисления множества Мандельброта почти в 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
                                       *                                      
                                       *                                      
                                       *                                      
                                       *                                      
                                       *                                      
                                      ***                                     
                                     *****                                    
                                     *****                                    
                                      ***                                     
                                       * 
                                   *********                                  
                                 *************                                
                                ***************                               
                             *********************                            
                             *********************                            
                              *******************                             
                              *******************                             
                              *******************                             
                              *******************                             
                            ***********************                           
                              *******************                             
                              *******************                             
                             *********************                            
                              *******************                             
                              *******************                             
                               *****************                              
                                ***************                               
                                 *************                                
                                   *********                                  
                                       *                                      
                                ***************                               
                            ***********************                           
                         * ************************* *                        
                         *****************************                        
                      * ******************************* *                     
                       *********************************                      
                      ***********************************                     
                    ***************************************                   
               *** ***************************************** ***              
               *************************************************              
                ***********************************************               
                 *********************************************                
                 *********************************************                
                ***********************************************               
                ***********************************************               
              ***************************************************             
               *************************************************              
               *************************************************              
              ***************************************************             
              ***************************************************             
         *    ***************************************************    *        
       *****  ***************************************************  *****      
       ****** *************************************************** ******      
      ******* *************************************************** *******     
    ***********************************************************************   
    ********* *************************************************** *********   
       ****** *************************************************** ******      
       *****  ***************************************************  *****      
              ***************************************************             
              ***************************************************             
              ***************************************************             
              ***************************************************             
               *************************************************              
               *************************************************              
              ***************************************************             
                ***********************************************               
                ***********************************************               
                  *******************************************                 
                   *****************************************                  
                 *********************************************                
                **** ****************** ****************** ****               
                 ***  ****************   ****************  ***                
                       **************     **************                      
                         ***********       ***********                        
                         **  * ***           *** *  **                        
                          *   *                 *   *
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB