multiprocessing Windows vs Linux

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.
Antworten
Serpens66
User
Beiträge: 259
Registriert: Montag 15. Dezember 2014, 00:31

Hallo :)

Zurzeit arbeite ich nur mit Threads, welche dafür sorgen, dass ein Programm x mal mit x unterschiedlichen Einstellungen gleichzeitig läuft.
Dabei gehts wirklich darum, dasses gleichzeitig läuft und nicht x mal so schnell.

Mein ungefährer Code Aufbau hier:
viewtopic.php?p=313172#p313172

Dennoch wird die Leistung ja für jeden thread geteilt, sodass es irgendwann passiert, dass das Programm deutlich langsamer arbeitet.
Deswegen bin ich nun dabei zusätzlich multiprocessing zu verwenden.
Daher möchte ich die main() (siehe verlinkten code), nun auf die verfügbaren CPUs verteilen. Also wenn ich 2 CPUs habe und 8 Instanzen laufen lassen will, dann sollen es 4 Threads pro CPU sein.

Das ganze habe ich auch schon fertig, doch nun fällt mir auf, dass Windows und Linux völlig anders mit Prozessen umgehen zu scheinen??
Starte ich mein Skript in Windows, wird das gesamte Skript pro Prozess quasi nochmal ausgeführt mit __name__==__mp_main__, abgesehen der Teil unter:
if __name__ == "__main__":
Auch sind Variablen, die unter dieser Zeile eingeführt wurden, in jedem Prozess unbekannt.

Doch auf Linux (Debian 8.1) wird das Skript offenbar nicht nochmal für jeden Prozess ausgeführt und unter der Zeile eingeführte Variablen scheinen bekannt.

Zusätzlich habe ich arge Probleme meine websocket module am laufen zu halten... auf windows scheinen sie trotz mehrer prozesse zu laufen, aber auf linux bricht die verbindung sofort ab...

Auf Windows hab ich i7.
Auf Debian 2CPUs.

Ich würde nun gerne wissen, wie genau ich mit diesen unterschieden umgehen soll und was es noch alles für Unterschiede gibt.
Das Skript soll möglichst identisch auf windows und auf Linux funktionieren. Windows nutze ich in erster Linie zum schnellen testen, wäre also nicht sooo wichtig, aber wäre schon praktischer, wenn ich weiterhin auf windows testen könnte, ohne extrem unterscheiedliche Ergebnisse zu bekommen.

Sind meine Beobachtungen korrekt, also gibt es diese Unterschiede? Oder ist das Unsinn und es liegt ganz sicher an meinem Code?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Serpens66: Windows kann keine Prozesse clonen, weshalb sie neu gestartet werden müssen. Um Deine Probleme anzugehen, ist die Antwort ganz einfach: benutze keine globalen Zustände, also weder als globale Variablen, noch globale Websocket-Verbindungen.
Serpens66
User
Beiträge: 259
Registriert: Montag 15. Dezember 2014, 00:31

Sirius3 hat geschrieben:@Serpens66: Windows kann keine Prozesse clonen, weshalb sie neu gestartet werden müssen. Um Deine Probleme anzugehen, ist die Antwort ganz einfach: benutze keine globalen Zustände, also weder als globale Variablen, noch globale Websocket-Verbindungen.
okay vielen dank :)
ja habe auch gemerkt, dass weboscket funktioniert, wenn ich sie erst im prozess selbst starte.
Gut werde ich dann so machen.
Antworten