2017-11-24 1 views
1

Ich lerne über Python Multiprocessing-Modul. Ich möchte, dass mein Code alle meine CPU-Ressourcen verwendet. Dies ist der Code, den ich schrieb:Python Multiprocessing Query

from multiprocessing import Process 
import time 

def work(): 
    for i in range(1000): 
     x=5 
     y=10 
     z=x+y 

if __name__ == '__main__': 
    start1 = time.time() 
    for i in range(100): 
     p=Process(target=work) 
     p.start() 
     p.join() 
    end1=time.time() 
    start = time.time() 
    for i in range(100): 
     work() 
    end=time.time() 
    print(f'With Parallel {end1-start1}') 
    print(f'Without Parallel {end-start}') 

Der Ausgang I bekommen, ist dies:

With Parallel 0.8802454471588135 
Without Parallel 0.00039649009704589844 

habe ich versucht, mit verschiedenen Bereichswerte in der for-Schleifen zu experimentieren oder Druck-Anweisung nur in Arbeit aber immer ohne Parallel läuft schneller. Gibt es etwas, das mir fehlt?

Vielen Dank im Voraus!

+1

die 'Arbeit()' Funktion ist zu einfach repräsentativ. In Ihrem Fall haben Sie nur einen Fall, wenn ein Overhead durch die Instanziierung von 'Process'-Objekten und deren Funktion verursacht wird. – RomanPerekhrest

+0

bitte Rückmeldung? – georgexsh

Antwort

3

Ihre Benchmark-Methode ist problematisch:

for i in range(100): 
    p = Process(target=work) 
    p.start() 
    p.join() 

Ich denke, man 100 Prozesse parallel ausgeführt werden soll, aber Process.join()blocks until process exit, Sie effektiv in Serien laufen. Führen Sie außerdem mehr ausgelastete Prozesse aus, da die Anzahl der CPU-Kerne zu hohen CPU-Konflikten führt, was eine Leistungseinbuße darstellt. Und wie ein Kommentar darauf hingewiesen, ist Ihre work() Funktion zu einfach, vergleichen Sie mit dem Overhead von Process Erstellung.

Eine bessere Version:

import multiprocessing 
import time 


def work(): 
    for i in range(2000000): 
     pow(i, 10) 

n_processes = multiprocessing.cpu_count() # 8 
total_runs = n_processes * 4 
ps = [] 
n = total_runs 

start1 = time.time() 
while n: 
    # ensure processes number limit 
    ps = [p for p in ps if p.is_alive()] 
    if len(ps) < n_processes: 
     p = multiprocessing.Process(target=work) 
     p.start() 
     ps.append(p) 
     n = n-1 
    else: 
     time.sleep(0.01) 
# wait for all processes to finish 
while any(p.is_alive() for p in ps): 
    time.sleep(0.01) 
end1=time.time() 

start = time.time() 
for i in range(total_runs): 
    work() 
end=time.time() 

print(f'With Parallel {end1-start1:.4f}s') 
print(f'Without Parallel {end-start:.4f}s') 
print(f'Acceleration factor {(end-start)/(end1-start1):.2f}') 

Ergebnis:

With Parallel 4.2835s 
Without Parallel 33.0244s 
Acceleration factor 7.71