Laden...

Grosse Menge Prozesse starten / Performance

Erstellt von Nullpunkt vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.824 Views
Thema geschlossen
N
Nullpunkt Themenstarter:in
277 Beiträge seit 2005
vor 12 Jahren
Grosse Menge Prozesse starten / Performance

Hi Forum

Ich habe eine Windows Forms App, aus der ich bis zu 50 weitere Prozesse starten
muss. Momentan mache ich das im Haupt-Thread mit der Process-Klasse, in
welcher ich auch die exited-Events abfange.

Warum so viele Prozesse?
Weil ich diverse Webbrowser in diversen Versionen starten muss.

Ich stelle nun aber fest, dass die Hauptapp teilweise abstürzt (Keine Rückmeldung)
wenn zu schnell oder zu viele Prozesse gestartet werden. Werden Prozesse nicht
sowieso in einem separaten Thread geöffnet oder empfiehlt sich das explizit?

Mfg
Nullpunkt

1.820 Beiträge seit 2005
vor 12 Jahren

Hallo!

Unabhängig deiner ursprünglichen Frage solltest du evtl. bei jedem Prozess auch solange warten, bis er mit starten fertig ist. Das geht mit WaitForInputIdle. Damit wird solange gewartet, bis der Prozess in den Leerlauf wechselt, also bereit ist für weitere Anforderungen.

Nobody is perfect. I'm sad, i'm not nobody 🙁

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Nullpunkt,

Werden Prozesse nicht sowieso in einem separaten Thread geöffnet ...

nö, Process.Start läuft in dem Thread, der es aufruft.

... oder empfiehlt sich das explizit?

jipp

Siehe auch [FAQ] Warum blockiert mein GUI?

herbivore

S
401 Beiträge seit 2008
vor 12 Jahren

Hallo,

also, du startest etwa 50 Prozesse. Warten diese Prozesse nach dem Start auf eine Eingabe oder durchläuft jeder Prozesse eine fest vorgegebene Routine?

Falls letzteres, dann solltest du nicht zu viele Prozesse auf einmal starten. Evtl. nur Anzahl der CPU-Kerne - 1. Dann sollte auch keine Überlastung des Systems auftreten und dein Programm wie gewohnt arbeiten.

Werden Prozesse nicht sowieso in einem separaten Thread geöffnet ...
nö, Process.Start läuft in dem Thread, der es aufruft.

Unter Linux handelt es sich bei den gestarteten Prozesse um Sub-Prozesse. Ist das unter Windows ebenfalls so oder erzeugt Process.Start einen neuen Hauptprozess?
Evtl. meint der Fragesteller dies.

Gruß, Thomas

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Siassei,

Kindprozesse gibt es auch unter Windows, aber Prozess.Start erzeugt m.E. eigenständige Prozesse.

Ich denke aber schon, dass es um Threads ging. Immerhin wurde auf "keine Rückmeldung" verwiesen, was ein Zeichen ist, dass der GUI-Thread nicht reagiert (weil er mit dem Starten der Prozesse beschäftigt ist). Und auch wenn Prozess.Start nicht darauf wartet, bis der Prozess beendet ist, braucht doch auch das reine Starten seine Zeit.

herbivore

S
401 Beiträge seit 2008
vor 12 Jahren

Kindprozesse gibt es auch unter Windows, aber Prozess.Start erzeugt m.E. eigenständige Prozesse.

Vielen Dank.

C
1.214 Beiträge seit 2006
vor 12 Jahren

Unter Linux handelt es sich bei den gestarteten Prozesse um Sub-Prozesse. Ist das unter Windows ebenfalls so oder erzeugt Process.Start einen neuen Hauptprozess?

Was meinst du mit Sub-Prozessen? Ein geforked Prozess bekommt als Parent ID die PID vom Prozess, der ihn geforked hat. Sonst gibts keinen unterschied zwischen Hauptprozessen und "Sub-Prozessen". Und Prozesse ohne einen Parent gibts eh nicht, das ist nur der Init Prozess, und das ist ein Sonderfall, der an vielen Stellen auch gesondert behandelt wird. Wenn du mit Process.Start einen Prozess startest, siehst du z.B. im Process Explorer, dass es ein Kindprozess von deinem Prozess ist. Aber es ist genauso ein "Hauptprozess", wie dein Prozess auch.

N
Nullpunkt Themenstarter:in
277 Beiträge seit 2005
vor 12 Jahren

Hallo zusammen und danke für die Antworten

Also: Die eigentliche App ist nur eine Windows Form, die das Starten von
50 Web-Browsern (FF, IE, Safari etc) in verschiedenen Versionen in einer
Art Sandbox erlaubt.

Moment starte ich mittels Process.Start() im GUI-Thread.
Bei den ersten Versuchen hätte ich erwartet, dass nach Starten des ersten
zusätzlichen Prozesses die GUI still steht und auf das Ende des Prozesses wartet,
bevor die Ausführung weiterläuft.

Dies ist aber nicht der Fall. Es werden alle Prozesse gestartet. Aus diesem Grund ging
ich zu Beginn davon aus, dass dies im Hintergrund in separaten Threads geschehen
muss - Ansonsten sollte die GUI doch blockieren?

In den weiteren Schritten wurden dann immer mehr Prozesse gestartet,
mittlerweile bei ungefähr 15. Und hier beginnt die Hauptapp dann plötzlich abzustürzen
bzw. nicht mehr zu reagieren.

Mfg
Nullpunkt

C
1.214 Beiträge seit 2006
vor 12 Jahren

Moment starte ich mittels Process.Start() im GUI-Thread.
Bei den ersten Versuchen hätte ich erwartet, dass nach Starten des ersten
zusätzlichen Prozesses die GUI still steht und auf das Ende des Prozesses wartet,
bevor die Ausführung weiterläuft.

Das ist mehr als ein eigener Thread. Es ist eben ein eigener Prozess 😉 Das Starten erfolgt in deinem Gui Thread. Aber sobald das Starten (also, Erzeugen eines neuen Prozesses) abgeschlossen ist, läuft der neue Prozess unabhängig von deinem.

S
401 Beiträge seit 2008
vor 12 Jahren

In wie weit hast du die Tipps von herbivore und tom-essen begutachtet?
Was hast du seit dem letztem Post gemacht?
Evtl. ein paar Code-Stück zeigen, das könnte hilfreich sein.

N
Nullpunkt Themenstarter:in
277 Beiträge seit 2005
vor 12 Jahren

Hi zusammen

Ich habe noch nichts gemacht, wollte eigentlich nur die Fragen nochmals
genauer erklären. Morgen werde ich das in eigene Threads auslagern und
denke dass dann das Problem erledigt sein wird.

Mfg
Nullpunkt

N
Nullpunkt Themenstarter:in
277 Beiträge seit 2005
vor 12 Jahren

So, passt nun alles.
Die Starts wurden in separate Threads ausgelagert.

Mfg
Nullpunkt

Thema geschlossen