Multiprocessing
Verfasst: Dienstag 21. Mai 2024, 09:42
Hi, ich verstehe nicht so ganz was ich bei multiprocessing falsch mache mein code angehängt wird irgendwie gar nicht ausgeführt.
Mir ist klar das in dem folgenden code einige dinge nicht schön umgesetzt sind.
Es handelt sich um die idee möglichst zeiteffizient primzahlen zu berechnen. Dafür soll später noch verbesserungen mit dem dictonary vorgenommen werden wofür es übergeben werden muss.
Ich bräuchte tipps für folgende dinge
1) Warum lauft das multiprocessing gegen eine wand. Bei mir endet das programm einfach nicht.
2) ich habe für multiprovessing ein 8 kern rechner angenommen, ziel war nur eine cpu nicht zu belasten um zumindest noch einen taskmanager aufzubekommen um die instanzen abschießen zu können wenn der prozess einfriert.
Deswegen rechne ich erst die primzahlen aus die kleiner sind als die wurzel der gegebenen größten zahl. Diese gebe ich in ein dictonary (für geschwindigkeit beim aufruf) und übergebe das dict und dann am subprozesse. Dannach rechne lasse ich die zahlen in einer liste weil ich Ich teile ich die verbleibenden recheneinheiten in 7 teile auf ... Sehr umständlich. Hier wären einige tipps hilfreich.
Optional- ich würde gerne die cpu anzahl variabel machen. Ich sehe aber keine möglichkeit dazu? Gibts hier keine schöne Lösung? Ich wollte eine For schleife nutzen habe aber gelesen dass wenn die einzelnen prozesse die mit for gestartet werden auch einzeln durchlaufen befor ein neuer prozess gestartet wird (doof für mp wo man je parallelität möchte) und dann auf die beendigung des vorherigen prozesses gewartet wird. Ebenso wurde empfohlen nicht join zu verwenden.
3) ich würde gerne ordnung in die rückgabe von den zurückgegebenen listen einführen und sie der reihe nach ausgeben lassen. Es muss nicht das hauptprogramm machen. Wenn es in reihnfolge also niedrigere primzahlen zuerst dann höhere primzahlen ausgegeben wird ist mir alles recht
Code:
import math
import threading
import time
import multiprocessing as mp
def is_int(string):
try:
if(int(string)==float(string)):
return True
else:
return False
except ValueError :
return False
def primtest(Pnum, nfrom, nto, lenght1,dict_num):
prim = True
k = 3
num_list = []
inputsqrt = math.sqrt(int(nto))
for n in range(nfrom , nto, 2) :
y = math.sqrt(n)
while k <= y :
if(n%k == 0):
prim = False
k = k + 2
k = 3
if prim == True :
num_list.append(n)
else:
prim = True
return(num_list, Pnum)
repeat = True
while (repeat):
input1 = input("Please give whole number for finding primes to")
input2 = input("f = program end")
if input2 == "f" :
input2 = False
if(is_int(input1)):
prim = True
k = 3
lenght1 = 0
dict_num = {"0" : 2}
inputsqrt = math.sqrt(int(input1))
for n in range(3 , int(inputsqrt), 2) :
y = math.sqrt(n)
while k <= y :
if(n%k == 0):
prim = False
k = k + 2
k = 3
if prim == True :
lenght1 = lenght1 +1
dict_num[n] = lenght1
else:
prim = True
print(*dict_num)
s = int(inputsqrt)
e = int(input1)
if(s%2 == 0):
s = s + 1
if(e%2 == 0):
e = e - 1
calc = e - s
work = int((calc / 7)+1)
if(e%2 != 0):
work = work - 1
p1nfrom = s
p1nto = s + work
p2nfrom = p1nto + 2
p2nto = s + work*2
p3nfrom = p2nto + 2
p3nto = s + work*3
p4nfrom = p3nto + 2
p4nto = s + work*4
p5nfrom = p4nto + 2
p5nto = s + work*5
p6nfrom = p5nto + 2
p6nto = s + work*6
pnfrom = p6nto + 2
pnto = e
p0 = threading. Thread(target=primtest,args=(0, pnfrom, pnto, lenght1, dict_num))
p0.start
if __name__ == '__main__':
p1 = mp.Process(target=primtest, args=(1, p1nfrom, p1nto, lenght1, dict_num))
p2 = mp.Process(target=primtest, args=(2, p2nfrom, p2nto, lenght1, dict_num))
p3 = mp.Process(target=primtest, args=(3, p3nfrom, p3nto, lenght1, dict_num))
p4 = mp.Process(target=primtest, args=(4, p4nfrom, p4nto, lenght1, dict_num))
p5 = mp.Process(target=primtest, args=(5, p5nfrom, p5nto, lenght1, dict_num))
p6 = mp.Process(target=primtest, args=(6, p6nfrom, p6nto, lenght1, dict_num))
p1.start()
p2.start()
p3.start()
p4.start()
p5.start()
p6.start()
print(*p1.num_list)
else:
print("Not a whole number")
Mir ist klar das in dem folgenden code einige dinge nicht schön umgesetzt sind.
Es handelt sich um die idee möglichst zeiteffizient primzahlen zu berechnen. Dafür soll später noch verbesserungen mit dem dictonary vorgenommen werden wofür es übergeben werden muss.
Ich bräuchte tipps für folgende dinge
1) Warum lauft das multiprocessing gegen eine wand. Bei mir endet das programm einfach nicht.
2) ich habe für multiprovessing ein 8 kern rechner angenommen, ziel war nur eine cpu nicht zu belasten um zumindest noch einen taskmanager aufzubekommen um die instanzen abschießen zu können wenn der prozess einfriert.
Deswegen rechne ich erst die primzahlen aus die kleiner sind als die wurzel der gegebenen größten zahl. Diese gebe ich in ein dictonary (für geschwindigkeit beim aufruf) und übergebe das dict und dann am subprozesse. Dannach rechne lasse ich die zahlen in einer liste weil ich Ich teile ich die verbleibenden recheneinheiten in 7 teile auf ... Sehr umständlich. Hier wären einige tipps hilfreich.
Optional- ich würde gerne die cpu anzahl variabel machen. Ich sehe aber keine möglichkeit dazu? Gibts hier keine schöne Lösung? Ich wollte eine For schleife nutzen habe aber gelesen dass wenn die einzelnen prozesse die mit for gestartet werden auch einzeln durchlaufen befor ein neuer prozess gestartet wird (doof für mp wo man je parallelität möchte) und dann auf die beendigung des vorherigen prozesses gewartet wird. Ebenso wurde empfohlen nicht join zu verwenden.
3) ich würde gerne ordnung in die rückgabe von den zurückgegebenen listen einführen und sie der reihe nach ausgeben lassen. Es muss nicht das hauptprogramm machen. Wenn es in reihnfolge also niedrigere primzahlen zuerst dann höhere primzahlen ausgegeben wird ist mir alles recht
Code:
import math
import threading
import time
import multiprocessing as mp
def is_int(string):
try:
if(int(string)==float(string)):
return True
else:
return False
except ValueError :
return False
def primtest(Pnum, nfrom, nto, lenght1,dict_num):
prim = True
k = 3
num_list = []
inputsqrt = math.sqrt(int(nto))
for n in range(nfrom , nto, 2) :
y = math.sqrt(n)
while k <= y :
if(n%k == 0):
prim = False
k = k + 2
k = 3
if prim == True :
num_list.append(n)
else:
prim = True
return(num_list, Pnum)
repeat = True
while (repeat):
input1 = input("Please give whole number for finding primes to")
input2 = input("f = program end")
if input2 == "f" :
input2 = False
if(is_int(input1)):
prim = True
k = 3
lenght1 = 0
dict_num = {"0" : 2}
inputsqrt = math.sqrt(int(input1))
for n in range(3 , int(inputsqrt), 2) :
y = math.sqrt(n)
while k <= y :
if(n%k == 0):
prim = False
k = k + 2
k = 3
if prim == True :
lenght1 = lenght1 +1
dict_num[n] = lenght1
else:
prim = True
print(*dict_num)
s = int(inputsqrt)
e = int(input1)
if(s%2 == 0):
s = s + 1
if(e%2 == 0):
e = e - 1
calc = e - s
work = int((calc / 7)+1)
if(e%2 != 0):
work = work - 1
p1nfrom = s
p1nto = s + work
p2nfrom = p1nto + 2
p2nto = s + work*2
p3nfrom = p2nto + 2
p3nto = s + work*3
p4nfrom = p3nto + 2
p4nto = s + work*4
p5nfrom = p4nto + 2
p5nto = s + work*5
p6nfrom = p5nto + 2
p6nto = s + work*6
pnfrom = p6nto + 2
pnto = e
p0 = threading. Thread(target=primtest,args=(0, pnfrom, pnto, lenght1, dict_num))
p0.start
if __name__ == '__main__':
p1 = mp.Process(target=primtest, args=(1, p1nfrom, p1nto, lenght1, dict_num))
p2 = mp.Process(target=primtest, args=(2, p2nfrom, p2nto, lenght1, dict_num))
p3 = mp.Process(target=primtest, args=(3, p3nfrom, p3nto, lenght1, dict_num))
p4 = mp.Process(target=primtest, args=(4, p4nfrom, p4nto, lenght1, dict_num))
p5 = mp.Process(target=primtest, args=(5, p5nfrom, p5nto, lenght1, dict_num))
p6 = mp.Process(target=primtest, args=(6, p6nfrom, p6nto, lenght1, dict_num))
p1.start()
p2.start()
p3.start()
p4.start()
p5.start()
p6.start()
print(*p1.num_list)
else:
print("Not a whole number")