Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
from multiprocessing import Pool
from tkinter import filedialog
import tkinter as tk
def do_sth(file_str):
#öffne das file und lese die Datenarrays
#berechne einen einzelnen Ergebniswert
return value_int
if __name__ == "__main__": #sonst werden zig Fenster geöffnet, hab noch nicht so richtig verstanden warum ...
root = tk.Tk()
root.withdraw()
files = filedialog.askopenfilenames(
initialdir=projectpath,
title='Please select the files to compare',)
files = list(files) #sonst wird ein tuple ausgegeben
p = Pool()
result = p.map(do_sth, files)
Also in diesem sehr allgemein gehaltenen Code ist kein Programmierfehler zu sehen. Da müsstest du schon konkreter werden. Insbesondere würde es uns helfen, wenn du sagst, was do_sth() tatsächlich tut. Aus dem Kommentar jedenfalls lässt sich der Grund für die Endlosschleife nicht ableiten.
Danke für die Rückmeldung. Die Methode kann ich aktuell leider nicht veröffentlichen.
Aber auch mit diesem einfachen Sample münde ich in einer Endlosschleife:
from asammdf import MDF
from multiprocessing import Pool
from tkinter import filedialog
import tkinter as tk
import numpy as np
def do_sth(file_str):
mdf = MDF(file_str)
data = mdf.get('Channelname')
a_z = data.samples
return np.mean(a_z)
if __name__ == "__main__": #sonst werden zig Fenster geöffnet, hab noch nicht so richtig verstanden warum ...
root = tk.Tk()
root.withdraw()
files = filedialog.askopenfilenames(
initialdir=projectpath,
title='Please select the files to compare',)
files = list(files) #sonst wird ein tuple ausgegeben
p = Pool()
result = p.map(do_sth, files)
@incoggnito: Das gleiche Problem was Du auch schon in dem Kommentar beschreibst. Das Modul muss sich importieren lassen können *ohne* das irgendwas passiert ausser das Konstanten, Funktionen, und Klassen definiert werden. Das sollte man sowieso so machen. Der gesamte Code nach dem ``if`` gehört *in* den ``if``-Zweig oder besser noch in eine eigene Funktion die von dort aufgerufen wird.
@snafu: Kann sein das Du kein Windows verwendest, denn AFAIK gibt es nur dort dieses Problem, weil es kein `fork()` auf Systemebene gibt. Deshalb wird von `multiprocessing` ein neuer Prozess gestartet der das `__main__`-Modul erneut importiert. Und wenn da beim Import `multiprocessing` was ausführt, geht dieses Spielchen rekursiv, endlos weiter.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
Ist halt immer die Frage was man parallelisiert. Wenn man ”nur” viele Dateien parallel lädt, dann kloppen sich halt entsprechend viele Prozesse gleichzeitig um den Datendurchsatz zum Hintergrundspeicher und eventuell auch um den verfügbaren Hauptspeicher.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
Das Problem saß vor dem Rechner ... hab nicht gesehen, dass das Netzwerk an der Grenze seiner Möglichkeiten war.
Da bin ich dann einfach an den Grenzen meiner Arbeitsumgebung
Wenn es Netzwerkverkehr ist, dann kann Threading was bringen, um damit mehrere Verbindungen gleichzeitig zu betreiben. Jetzt ist halt die Frage ob das Netzwerk tatsächlich ausgelastet ist oder ob du es nur glaubst...
Ok, da stecke ich zu wenig in der Thematik.
Taskmanger --> Auslastung 100%. 100MBits...
Recherchiere mal wie das Netzwerk Threading funzt.
Habe aber wenig Hoffnung, hänge an einem großen Firmennetzwerk.
snafu hat geschrieben: Mittwoch 5. September 2018, 15:26
Wenn es Netzwerkverkehr ist, dann kann Threading was bringen, um damit mehrere Verbindungen gleichzeitig zu betreiben. Jetzt ist halt die Frage ob das Netzwerk tatsächlich ausgelastet ist oder ob du es nur glaubst...
Threading bringt nichts an sich, sondern kann bei IO-lastigen Aufgaben genutzt werden, weil das warten auf IO die Ausfuehrung dominiert. Da der TE aber schon eine multiprocessing-Loesung hat, wird es nichts aendern, wenn seine Leitung schon saturiert ist.