Machbarkeitsanfrage Python oder andere Sprache

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.
Yogi
User
Beiträge: 80
Registriert: Montag 21. Januar 2008, 16:35
Wohnort: Bonner

Hi, dies ist mein erstes Posting hier. Ich habe zwar seit einigen Wochen vieles gelesen und ausprobiert und ich fühle mich (wieder) recht wohl mit Python. Ich habe vor einigen Jahren ein kleines Tool für Softimage XSI in Python erstellt und das klappte ganz gut, habe es aber dann wegen mangelnder API Unterstützung seitens XSI wieder sein lassen. Auch hatten viele Leute damals Probleme damit, die richtige Version von Python zu installieren. Momentan arbeite ich mich in Java ein, und erstelle gerade eine Proxy- Version eines Projektes in BlitzMax. Diese ist so gut wie beendet und läuft unoptimiert recht zügig.

Aber das nur als Vor-Info.

Was ich hier fragen möchte ist, wie eure Meinung ist, bezüglich der serverseitigen Umsetzung meines Projektes in Python. Leider kann BlitzMax kein Threading und fällt dadurch weg. Eigentlich hatte ich vor, mein Projekt in Java um zu setzen, aber durch einen bekannten und eigenen Nachforschungen kam ich wieder zu Python. Und wenn ich Wahl habe ob Java oder Python dann würde ich Python doch vorziehen ;)

Also, jetzt mal was genauer um was es geht:

Stellt euch einen Planeten-Simulation vor, also viele Planeten, die miteinander alle in Abhängigkeit stehen (Umlaufbahn etc)

Ich möchte nun serverseitig die Simulation ständig am laufen haben. Die Koordinaten der einzelnen Planeten (so ca. 1000) sollen möglichst realtime mäßig an eben so viele Clients übertragen werden, die durch den Raum navigieren können. Die eigentlich Darstellung ist dann Clientsache und kann in sonst einer Sprache bewerkstelligt werden.

Klar ist, dass ich nicht alle Positionen an alle Clients übertragen kann, deswegen sollen erst einmal nur die Positionen übertragen werden, die in nächster Nähe des Clients sind. Der Rest folgt später, wenn ich eine effektive Optimierungstechnik ausgetüftelt habe.

Meine Fragen nun:

1) Kann ich mein Python-Programm als Applikation auf einem (Apache?)-Server non-stop laufen lassen?

2) Kann ich die Berechnungen so optimieren, dass sie von der Geschwindigkeit her in Richtung C, C++ C#, Java ... gehen?
Folgenden Link habe ich da als Info-Quelle zu gezogen http://www.scipy.org/PerformancePython

3) Wenn ich alles OO mässig machen möchte, wie kann ich die Daten aus den Objekten (Planeten) an C-Routinen übergeben. Da die Berechnung nach dem Motto ' jeder mit jedem ', also nach der Formel
( Anzahl Berechnungen = n * ( n + 1 ) / 2 ) geht, sind einige Berechnungen pro Tick durch zu führen.

Ich habe dazu noch nichts gefunden. Würdet ihr nur die eigentlichen Berechnungen innerhalb der Methode konvertieren oder die ganze Methode an sich auslagern?

4) Ich dachte an die Kombination lighttpd - twinsted - sqlalchemy
Ist das erprobt und bewährt? Spricht was dagegen. Statt lighttpd lieber Apache?

5) Ich schätze sowas wird nur über einen dedicated Server gehen. Was für ein BS würdet ihr empfehlen? Linux oder Win2003? Wenn Linux, welches genau? Ich möchte nämlich gerne erst einmal alles auf meinem Rechner testen und dann wenn mehr Leute sich anschliessen auf einen echten Server umsteigen.

Ich glaube, das wäre es erst einmal.

Ich wäre euch für alle Informationen sehr dankbar. Wenn es irgendwie geht würde ich nämlich lieber die Komplexität von Java mit Projekt-Darkstar umgehen.

Falls ihr euch Gedanken über die generelle Machbarkeit macht, so seid beruhigt, zumindest die Proxy-Simulation funktioniert bis jetzt wunderbar und das bei 3D-Darstellung und freier Navigation. Es geht eigentlich darum, was ich jetzt habe um zu setzen mit Python und auf dem Server am laufen zu kriegen und die zu übermittelnde Datenmenge soweit zu reduzieren, dass keine zu großen Lags entstehen (wobei kleinere Lags kein Thema sind, wird also keiner erschossen oder so ;) )

So, jetzt mal sehen wer das alles lesen möchte....

Schöne Grüße
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo Yogi!

Willkommen im Python-Forum!
Yogi hat geschrieben:Ich möchte nun serverseitig die Simulation ständig am laufen haben.
Das kannst du als eigenständiges Programm oder hinter einem Apachen usw. laufen lassen. Das ist kein Problem.

Yogi hat geschrieben:Die Koordinaten der einzelnen Planeten (so ca. 1000) sollen möglichst realtime mäßig an eben so viele Clients übertragen werden, die durch den Raum navigieren können.
Was jetzt? Tragen 1000 Leute einen Laptop durch die Gegend und warten auf Koordinaten vom Server? ???

Realtime ist nicht zu schaffen. Du wirst schon genauer definieren müssen, wie oft pro Sekunde alle 1000 Clients die Koordinaten erreichen müssen. Und willst du die Clients den Server auffordern lassen die Koordinaten zurück zu geben, oder willst du die Koordinaten unaufgefordert an die Clients schicken.

Wenn es schnell sein muss, dann würde ich auf die Anfrage der Clients verzichten und diesen die Koordinaten unaufgefordert übermitteln.
Yogi hat geschrieben:Klar ist, dass ich nicht alle Positionen an alle Clients übertragen kann, deswegen sollen erst einmal nur die Positionen übertragen werden, die in nächster Nähe des Clients sind.
Jetzt scheitert es wieder an meinem Vorstellungsvermögen, da ich ja nicht weiß, was das für Clients sind und wie die so im Kosmos herumirren. Zu Fuß? ;-)
Yogi hat geschrieben:1) Kann ich mein Python-Programm als Applikation auf einem (Apache?)-Server non-stop laufen lassen?
Natürlich geht das. Du kannst ein Programm laufen lassen und den Apachen die Anfragen umleiten lassen. Stichworte: mod_proxy und mod_rewrite.

Außerdem kannst du ein Python-Programm auch als eigenständigen Webserver laufen lassen. Stichworte: WSGI oder CherryPy.
Yogi hat geschrieben:2) Kann ich die Berechnungen so optimieren, dass sie von der Geschwindigkeit her in Richtung C, C++ C#, Java ... gehen?
Das kommt auf die Berechnungen an. Aber du kannst Berechnungen in externe Module auslagern, die in C, C++, usw. geschrieben werden können. Du kannst mit ``ctypes`` auf C-DLLs zugreifen. Du kannst mit pyRex oder Clython, mit einer Python-ähnlichen Programmiersprache, optimierte Module erstellen, die von GCC kompiliert werden. Diese werden wie andere Module in das Programm eingebunden.
Yogi hat geschrieben:4) Ich dachte an die Kombination lighttpd - twinsted - sqlalchemy
Welchen Webserver du benutzt ist egal. Twisted ist kompliziert. Vielleicht brauchst du es gar nicht. SQLAlchemy soll nicht schlecht sein. Aber wenn du Performance brauchst, dann würde ich direkt auf die Datenbanken zugreifen und mit "Stored Procedures", direkt in der Datenbank, arbeiten. Außerdem ist nicht sicher, ob es für dich nicht sogar bessere Datenstrukturen und Datenspeicher gibt. Dazu weiß ich noch zu wenig über dein Projekt.
Yogi hat geschrieben:5) Ich schätze sowas wird nur über einen dedicated Server gehen.
Zu wenig Infos...

.

Was mir jetzt nicht ganz klar wurde: Willst du jetzt eine Website erstellen die von 1000 Browsern abgerufen wird, oder willst du ein optimiertes Serverprogramm, welches Clientprogramme (nicht Browser) mit Daten beliefert?

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Yogi
User
Beiträge: 80
Registriert: Montag 21. Januar 2008, 16:35
Wohnort: Bonner

Hi gerold,
Was jetzt? Tragen 1000 Leute einen Laptop durch die Gegend und warten auf Koordinaten vom Server? ???
Wenn die alle bei Starbuck einen Cappu trinken, dann auch das ;) Eigentlich soll das ein MMO-Teil werden, wobei in der ersten Version erst mal nur reines zuschauen gehen soll. in späteren Versionen folgt dann die Clientseitige Interaktion.

Die Clients können in alles mögliche erstellt sein, sei es rein Browser-Basiert, oder in Flash mit simpler 2D-Darstellung bzw. später als eigenständige Clients mit Full 3D.
Jetzt scheitert es wieder an meinem Vorstellungsvermögen, da ich ja nicht weiß, was das für Clients sind und wie die so im Kosmos herumirren. Zu Fuß?
Die Clients definieren Attribute der Planeten und schauen sich dann die Interaktionen an, können also entweder frei im Raum navigieren bzw. haben den Fokus auf einen Planeten und sehen was drum herum geschieht.
Wenn es schnell sein muss, dann würde ich auf die Anfrage der Clients verzichten und diesen die Koordinaten unaufgefordert übermitteln.
Ich dachte, dass sich die Clients anmelden und dann solange mit Daten versorgt werden bis sie sich entweder ausloggen oder eine gewisse zeit kein Lebenszeichen von sich geben.

Realtime ist nicht zu schaffen
Ich brauche kein Realtime wie bei einem FPS. Da sich alles recht gemächlich bewegt und die Bewegungen auch gut interpoliert werden können, reicht ein 'so schnell wie möglich' also auch einmal pro Sekunde bzw. auch noch ein bisschen langsamer, wenns nicht anders geht.
Welchen Webserver du benutzt ist egal. Twisted ist kompliziert. Vielleicht brauchst du es gar nicht.
Hmmm, ich dachte an Twisted, weil es einige nützliche andere Module integriert hat, chatten z.B. und Mail. Aber da ich momentan noch eine One-Man-Show bin gilt je einfacher desto besser. Nur zuverlässig und performant soll es sein. Skalierbarkeit ist auch ein Thema, d.h mehr als tausend Clients dürfen pro Universum nicht sein, sonst wird die Anzahl der Berechnungen zu hoch. Laut meinen kleinen Test-Benchmarks sind 1000x1000 Clients um Faktor 1000 schneller als dirtekt ein Universum mit 1.000.000 Clients, ist ja logisch bei der o.g. Formel. Gott sei Dank kann ich auf die langsamen trigonometrischen Funktionen verzichten.
Da stellt sich also auch die Frage nach den gleichzeitig möglichen Verbindungen und ob ich virtuelle Server haben kann. Da kenne ich momentan noch viel zu wenig aus...

Aber Summa Summarum scheint Python durchaus dazu in der Lage zu sein, oder? Was spricht denn gegen Python? oder pro Java?

Schöne Grüße
Warhog
User
Beiträge: 11
Registriert: Samstag 26. Januar 2008, 21:53
Kontaktdaten:

Hi,

zu deiner Performance-/Geschwindigkeitsfrage... Python ist durchaus schnell, Python kompiliert ebenfalls in bytecode und kommt damit an Java heran. Ich würde sogar sagen dass Java und Python näher beieinander sind als Java und C++ (oder C).

Deine Anwendung soll über's Internet, nicht über ein lokales Netzwerk laufen? Ich denke dein Hauptproblem wird dabei wirklich die Bandbreite werden, weswegen die Wahl der Programmiersprache weniger wichtig ist als dein Design des Protokolls mit dem du die Daten übermitteln willst.

An deiner Stelle würde ich glaube ich die Programmteile separieren. Einen Teil der die Positionen der Planeten kalkuliert und fertige "Positionspakete" (protokollnah) organisiert nach Raumsektoren abspeichert, einen anderen der den Clients einfach nur die Sektoren aushändigt die sie benötigen (eben in ihrer Nähe sind). Das Abspeichern auf Festplatte ist zu vermutlich zu langsam/zeitintensiv, also entweder ein großes Programm mit Shared Memory und Threads, oder ein Dateisystem das den Arbeitsspeicher nutzt (UnionFS z.B.) - womit ich zu deiner Frage komme: Linux oder Windows.

Meines Wissens nach ist Windows "besser" im Umgang mit Threads (die du wohl benötigen wirst, insbesondere wenn 1000 Clients auf einen Webserver zugreifen (siehe auch das 10.000-Clients-Problem: http://www.kegel.com/c10k.html ), wobei das differenziert betrachtet werden will. Unter Linux gab es lange Zeit keine einheitliche Thread-API, auch jetzt gibt es die noch nicht. Es gibt Thread-Lösungen die besser sind als unter Windows, es gibt welche die schlechter sind. Allerdings kommt es auf die verwendeten Toolkits an. Ich weiß nicht mit welchen der Python-Interpreter und der Java-Interpreter arbeiten. Was den ganzen Rest angeht, würde ich dir zu Linux raten - für deine Bedürfnisse könntest du's dir schon fast selber kompilieren ;-D, aber da du bestimmt mit deinem Projekt schon ausgelastet genug sein wirst würde ich dir zu einer robusten und gut gewarteten Distribution wie SuSe, Debian oder Gentoo raten (an Performance denkend sowieso Gentoo).

Gruß & Gute Nacht, Warhog

PS: Verstehe ich das eigentlich richtig, dass jeder Client auch eigene Planeten/Objekte mit bestimmten Umlaufbahnen in das System reinsetzen können soll?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo Yogi!

Was ist ein "MMO-Teil"?
Was ist ein "FPS"?

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Warhog
User
Beiträge: 11
Registriert: Samstag 26. Januar 2008, 21:53
Kontaktdaten:

Ich wag's mal zu beantworten ;)

Massive Multiplayer Online (Game) -> wie bsp WOW
und bei FSP tippe ich mal nicht auf Frames per Seconds sondern First Person Shooter ;)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

gerold hat geschrieben:Was ist ein "MMO-Teil"?
Massive Multiplayer Online, also der erste Teil von MMORPG.
gerold hat geschrieben:Was ist ein "FPS"?
First Person Shooter.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

@Warhog: Wenn Du Python mit Java vergleichen willst, musst Du `psyco` dazu nehmen. Java's Bytecode wird zur Laufzeit in der Regel in Maschinensprache übersetzt. Stichwort: "Just In Time"-Compiler.
Warhog
User
Beiträge: 11
Registriert: Samstag 26. Januar 2008, 21:53
Kontaktdaten:

Lässt man python in parrot laufen geht auch das ;)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Leonidas hat geschrieben:
gerold hat geschrieben:Was ist ein "MMO-Teil"?
Massive Multiplayer Online, also der erste Teil von MMORPG.
gerold hat geschrieben:Was ist ein "FPS"?
First Person Shooter.
Hallo Leonidas!

Ach! Und ich dachte wirklich, es soll etwas wissenschaftliches werden. Oder z.B. eine 3D-Planetensimulation für ein modernes Museum. -- Mit Interaktionsmöglichkeiten :|

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Yogi
User
Beiträge: 80
Registriert: Montag 21. Januar 2008, 16:35
Wohnort: Bonner

Hallo Warhog,
Ich würde sogar sagen dass Java und Python näher beieinander sind als Java und C++ (oder C).
Ich weiss nicht, ob ich das so unterschreiben kann. In einem kleinen Test mit einigen Sprachen, war Java verdammt schnell, bezogen auf Delphi, C#, PureBasic und BlitzMax. Da kam Java wohl zugute, dass es einen JIT-Compiler hat. Aber dieser Test war mit trigonometrischen Funktionen, die ich jetzt doch zum Glück doch nicht brauche.
An deiner Stelle würde ich glaube ich die Programmteile separieren
Ich wollte das durch Threads lösen. Dabei alle Daten im Speicher halten und periodisch die Datenbank aktualisieren.

Der Link zu dem 10.000 Clients Problem ist sehr gut, werde ich mir gründlich durchlesen. Ich hoffe, durch die Beschränkung auf 1000 Clients aber einige Probleme umgehen zu können.

Ich bin mir auch nicht sicher, ob ich pro Client einen Thread aufmachen sollte.
aber da du bestimmt mit deinem Projekt schon ausgelastet genug sein wirst
Da ist wohl was wahres dran ;)
Ich habe mir überlegt Hilfe an Land zu holen, aber scheinbar ist da immer das Ego im Weg zu sein, die beiden, die ich gefragt habe, wollten entweder erst einmal alles platt machen und von Null auf anfangen (Zitat: "ich möchte kein Programmiersklave sein" bzw. "es soll ja auch von mir sein" oder sich direkt mit vollem Mitbestimmungsrecht einsetzen wollen, mit der Anmerkung, dass ich aber drauf gefasst sein sollte, dass das am Ende alle anders aussehen könnte als ich es mir vostelle!

Also ehrlich gesagt, dann krebse ich lieber alleine weiter... wenn ich das System in seinen Grundzügen am laufen habe, kann ich immer noch auf Brautschau gehen.

Oje, das war aber jetzt OT :)
PS: Verstehe ich das eigentlich richtig, dass jeder Client auch eigene Planeten/Objekte mit bestimmten Umlaufbahnen in das System reinsetzen können soll?
Yep! Das erklärt mein Projekt am besten. Natürlich ist es ein bisschen tiefgreifender als das, aber es geht ja um die Anforderungen...

Schöne Grüße

Edit: Eben hat einer das geschrieben.
Besides most MMORPG servers most certainly do not run Linux.
Kann dazu nichts sagen, weiss hier einer mehr??
Ach ja, und dann meinte er, dass Python komplexer wäre als Python, wegen:
It has more features and a different philosophy than Java. Duck typing vs. inheritance, late binding vs. early binding, lambda calculus vs. nothing, the list goes on.
Kann ich auch nix zu sagen. Aber eure Meinung würde mich interessieren.
Zuletzt geändert von Yogi am Sonntag 27. Januar 2008, 01:34, insgesamt 1-mal geändert.
BlackJack

@Warhog: Parrot? Soweit ich weiss sind die Bemühungen mit Python eingeschlafen. `psyco` ist dagegen zwar nur für x86 verfügbar, aber eben *verfügbar*.
Yogi
User
Beiträge: 80
Registriert: Montag 21. Januar 2008, 16:35
Wohnort: Bonner

gerold hat geschrieben: Ach! Und ich dachte wirklich, es soll etwas wissenschaftliches werden. Oder z.B. eine 3D-Planetensimulation für ein modernes Museum. -- Mit Interaktionsmöglichkeiten :|

lg
Gerold
:-)
Es wird zumindest kein Spiel, mehr was psychologisches und gesellschaftliches, wirklich sehr interessant. Aber ich möchte nicht zu viel verraten. Ein geübter Progger hätte das Teil wahrscheinlich in einem Bruchteil meiner Zeit fertig und das täte mir leid :) Ich habe ein Jahr an dem Konzept gearbeitet und erst dann angefangen mit der ersten Umsetzung. Jetzt ist Teil 2 dran, die Umsetzung auf Server/Client. Wenn das dann läuft möchte ich langsam die anderen Funktionalitäten einbauen. Schritt für Schritt, die Komplexität im Griff haben...
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Yogi, du sagst fragst, was weniger komplex und für dich besser handhabbar ist: Eine Kombination aus Python und C oder Java. Du willst einen Server schreiben, der möglichst parallel 1000 Planetenbahnen berechnet. Ist das so richtig? Ist das überhaupt ein Problem, dass sich parallelisieren lässt? Ohne genau zu wissen, was da berechnet werden muss, tippe ich darauf, dass dein Bottleneck bei der Übertragung der Planetenpositionen an die Clients (du schriebst etwas von 10.000) liegt. Sind Planetenbahnen nicht etwas, das vorhersagbar ist und das die Clients auch selbst berechnen könnten?

Wenn du die rohe Ausführungsgeschwindigkeit von Java und Python vergleichst, wird IMHO immer Java gewinnen. Ich schätze es eine Größenordnung schneller ein. Müssen nicht gerade Matrixoperationen mit vielen Zugriffen auf Arrays durchgeführt werden, wird die Geschwindigkeit mit der von C vergleichbar sein. Unter Solaris, Linux oder Windows wird auch echtes Multithreading kein Problem sein und du könntest voll von der rohen Rechenleistung eines QuadCore-Prozessors oder einem Cluster aus SPARC-Prozessoren profitieren. Bei 1000 wäre es gerade noch möglich, entsprechend viele Threads zu benutzen, du bräuchtest dann aber sehr viel Hauptspeicher (in der Größenordnung von 2 GB tippe ich). Besser ist wahrscheinlich, mit einer von der Anzahl der Prozessorkerne abhänigen Anzahl von Workerthreads loszulaufen und dann den Code so zu gestalten, dass er in kurzen Segmenten von den Workern bearbeitet werden kann. Das ist leider alles recht kompliziert.

Python + C könnte so schnell wie Java (oder schneller) sein, ist dann aber IMHO nicht so einfach, weil du nicht eine sondern zwei Sprachen beherrschen musst, von denen die eine zwar eleganter als Java, die andere dafür aber noch furchtbarer ist ;) Außerdem ist auf einmal dein Betriebssystem wichtig. Wie einfach die Java-Welt hier sein kann, wurde mir erst bewußt, als ich mit Python angefangen hatte.

Zum Server kann ich nichts weiter sagen, als dass ich da bei Java kein Problem sehen würde. Ich würde wahrscheinlich auf Tomcat oder Jetty aufsetzen, selbst wenn C/S nicht per HTTP sprechen sollen. Vielfach vergessen wird, das Servlets nicht HTTP-spezifisch sind.

Wenn du erstmal, wie du schreibst, austüfteln willst, wie der Server funktioniert, ist wahrscheinlich Python besser zum Experimentieren in dem Sinne, dass du eine wesentlich weniger komplizierte Sprache und Entwicklungsumgebung hast. Java ohne IDE ist unmöglich und Eclipse, Netbeans oder IDEA zu beherrschen, ist ein Unterfangen mit einem Aufwand, der so groß ist wie die Sprache selbst zu lernen. Nicht, dass es das nicht wert wäre - aber es kann vielleicht dazu führen, dass zu späte Erfolgserlebnisse dich das Projekt aufgeben lassen.

Stefan
Yogi
User
Beiträge: 80
Registriert: Montag 21. Januar 2008, 16:35
Wohnort: Bonner

Hi sma,

die Abhängigkeiten unter den Planeten wird einmal pro Tick berechnet, eine Parallelisierung bringt da glaube ich nichts.

Du hast da Recht, der Bottleneck wird die Übertragung der Positionen zu allen Clients sein. Und es werden maximal immer 1000 sein, 10.000 sind für meine Belange utopisch. Aber selbst bei 1000 kann die Datenmenge zwischen 1-4 MB liegen, unoptimiert natürlich. Und das alles so oft pro Sek wie möglich! Deswegen werde ich im ersten Schritt nur die jeweils angrenzenden Planeten übertragen, das wird die Datenmenge/Sek deutlichst reduzieren. Nach und nach werden ich dann den Radius erweitern. Ich habe da einige Optimierungsmöglichkeiten ausgedacht, aber ich möchte mich nicht jetzt schon damit befassen.

Wenn Python an und für sich, also für die meisten Nicht-Bererechnungsintensiven Teile, unoptimiert bleiben kann und ich also nur die Kräfteberechnungen nach C portieren muss, dann ist das schon ok. Anders wäre es, wenn ich das meiste nach C portieren müsste, dann würde ich doch zu Java tendieren.
Besser ist wahrscheinlich, mit einer von der Anzahl der Prozessorkerne abhänigen Anzahl von Workerthreads loszulaufen und dann den Code so zu gestalten, dass er in kurzen Segmenten von den Workern bearbeitet werden kann. Das ist leider alles recht kompliziert.
Das habe ich prinzipiell verstanden, aber ist denn sowas in Python möglich? Habe da gerade von Stackless Python gelesen, wäre das was?

Sind denn 2GB bei Servern nicht schon beinahe normal?

Ich möchte es halt so konzipieren, dass, wenn es denn Leuten gefällt, ich einfach aufstocken kann. Also ein System, welches erst einmal nur maximal 250 Leuts halten kann und dann komplett neu aufgesetzt werden müsste, wäre für meine Belange nicht tauglich.

Klar wäre auch Java sehr nett, nur ich lese und verstehe Python einfacher als Java. Bei Java fühle ich mich bald erschlagen und da ich das Projekt auch mal fertig stellen möchte, würde ich eine Alternative nicht scheuen ;)
es kann vielleicht dazu führen, dass zu späte Erfolgserlebnisse dich das Projekt aufgeben lassen
Genau!
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Yogi hat geschrieben:Aber selbst bei 1000 kann die Datenmenge zwischen 1-4 MB liegen, unoptimiert natürlich.
Ich vermute, 4 MB für 1000 Clients, also 4 KB pro Client. Das ist doch prinzipiell möglich, dein Server muss dafür aber mit mehr als 40 MBit angeschlossen sein. Allerdings pustest du so pro Stunde 14 GB ins Netz, oder 10 TB pro Monat. Oh, ich sehe gerade, du willst das auch noch X-mal pro Sekunden schaffen, mehr als 2 ist bei typischen Mietservern wahrscheinlich nicht drinn.
Yogi hat geschrieben:Das habe ich prinzipiell verstanden, aber ist denn sowas in Python möglich? Habe da gerade von Stackless Python gelesen, wäre das was?
Ich bin da kein Experte, aber ich denke, nein, es ist nicht möglich. Stackless kann zwar mit tasklets fast beliebig viele Threads oder Prozesse simulieren, dennoch ist das immer nur ein Betriebssystem-Prozess (und wohlmöglich auch nur ein Thread, da weiß ich's nicht) und das skaliert überhaupt nicht.
Yogi hat geschrieben:Sind denn 2GB bei Servern nicht schon beinahe normal?
Sie nur für die Systemstacks der Betriebssystemthreads zu benötigen würde ich dennoch als grobe Verschwendung bezeichnen.
Yogi hat geschrieben:Ich möchte es halt so konzipieren, dass, wenn es denn Leuten gefällt, ich einfach aufstocken kann. Also ein System, welches erst einmal nur maximal 250 Leuts halten kann und dann komplett neu aufgesetzt werden müsste, wäre für meine Belange nicht tauglich.
Java deutlich besser kennend als Python würde ich hier vom Bauch zu Java tendieren. Möglicherweise ist Jython ein guter Kompromiss. Leider ist dieser Python-Dialekt immer noch veraltet. Doch zumindest wurde das Projekt vor einiger Zeit ja wieder aus einem todesähnlichen Schlaf wachgeküsst.

Wie verhält es sich eigentlich mit IronPython? Microsofts .NET VM ist ähnlich effizient wie Sun Java-VM (wenn auch nicht ganz so gut IMHO, da sie mehr in Richtung Client als für Serverbelange optimiert ist) und dort könnte man den performance-kritischen Teil in C# schreiben und direkt mit IronPython kombinieren.

Ich würde zwar lieber Java als offenere Plattform empfehlen, aber IronPython scheint mir deutlich vollständiger zu sein und wenn ich Windows als Plattform nicht stört...

Stefan
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo!

Python ist ideal um das komplette Gerüst der Anwendung zu programmieren. Nachdem man eine funktionierende Anwendung mit Python geschrieben hat, geht man daran, diese gezielt zu testen und die evt. auftretenden Performance-Engpässe zu optimieren.

Als ersten Schritt optimiert man die Algorithmen, die sich als Engpass erweisen -- falls es so etwas überhaupt gibt.

Dann bindet man Psyco http://psyco.sourceforge.net/ mit ein. Das kann bei Berechnungen und Stringoperationen Wunder wirken.

Wenn das immer noch nicht so viel bringt wie man es gerne haben möchte, dann lagert man die performancekritischen Algorithmen aus.

Dafür gibt es pyrex http://www.cosc.canterbury.ac.nz/greg.e ... hon/Pyrex/ oder Cython http://www.cython.org/.

Der Vorteil dieser Vorgehensweise liegt auf der Hand. Man sieht sehr schnell Fortschritte. Funktionierende Programme sind sehr schnell erstellt. Oft braucht man nichts oder nur sehr wenig zu optimieren und spart sich dadurch extrem viel Zeit, die ansonsten durch unkontrolliertes Voraboptimieren drauf gehen würde.

Die nächste wichtige Sache ist der Datenspeicher.

Wenn man die Datenspeicherung einem Datenbanksystem wie z.B. PostgreSQL überlässt, dann kann man dieses Datenbanksystem auf einen eigenen Computer mit schnellen Gigabit-Netzwerkverbindungen auslagern. So kann ein schneller Datenbankserver mit viel RAM mehrere Auslieferserver (Proxy) bedienen. In weiterer Folge kann man die Last sogar auf mehrere Datenbankserver mit gespiegelten Daten aufteilen. Man kann Schreiboperationen an einen eigenen Datenbankserver übermitteln. Dieser kümmert sich dann darum, dass die neuen Daten sofort an die anderen Datenbankserver weitergegeben werden. Oft ist es so, dass ein Großteil der ganz neuen Daten für die Clients nicht wichtig ist. Deshalb kann das sogar verzögert stattfinden. Man kann auch mehrere Datenbankserver im Multimaster-Betrieb zusammenschließen. Das hat den Vorteil, dass der Client, der die neuen Daten übermittelt hat, sofort damit arbeiten kann. Alle Clients, die mit dem selben Datenbankserver arbeiten, haben diese Daten auch sofort zur Verfügung. Nur die Clients, die mit einem anderen Datenbankserver verbunden sind, bekommen die neuen Daten verzögert mit.

Solche Strategien gibt es viele und müssen teilweise schon während dem Programmieren berücksichtigt werden. Z.B. kann man keine fortlaufende Zahl als Index verwenden. Dafür verwendet man stattdessen GUIDs (Global Unique IDs). So fällt ein Probleme beim Synchronisieren weg.

Also ich würde einfach mal mit einem Server anfangen und damit alles so programmieren, dass man damit die ersten paar hundert Clients gut bedienen kann. Es hat sich noch *nie* rentiert, schon vorab zu optimieren. Und davon kann ich ein Lied singen. Ich war auch mal so ein Voraboptimierer.

Man muss immer eines Bedenken:
- 1.) Meistens kommt es anders!
- 2.) Als man denkt!"

Was den Server betrifft, kann ich dir nur zu Hetzner http://hetzner.de/ raten. Die vermieten für wenig Geld wirklich leistungsstarke Server und gute Netzanbindung. Das Service ist nicht schlecht und Emails werden persönlich und nicht von einem Computer beantwortet.

Weiters würde ich dir dazu raten, das Buch "Exploring Python" zu lesen. -- Aber erst dann, wenn du vorher ein paar andere Python-Bücher gelesen hast. -- Dort erfährst du etwas über Koroutinen und Continuations, Generatoren, Microthreads, usw. Damit weißt du dann genug darüber um entscheiden zu können, ob sie dir für dein Vorhaben etwas bringen oder nicht.

Du kannst außerdem Aufgaben auf mehrere einzelne Programme aufteilen. Da diese die gleiche Datenbasis, also die Datenbank, benutzen können, brauchst du dir dadurch keine Sorgen über die Auslastung des Systems machen. Mehrere Prozesse müssen ja nicht immer nur von einem einzigen Programm ausgehen. Man kann mehrere Programme parallel laufen lassen und diesen Programmen Nachrichten übermitteln.

Und wir sind hier ein Python-Board. Kein "nimm lieber Java, weil ich kenn mich in Java besser aus"-Board. Python ist das Zauberbuch und wir sind die Zauberer. Manche finden das früher und manche später heraus.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Yogi
User
Beiträge: 80
Registriert: Montag 21. Januar 2008, 16:35
Wohnort: Bonner

Ich vermute, 4 MB für 1000 Clients, also 4 KB pro Client. Das ist doch prinzipiell möglich, dein Server muss dafür aber mit mehr als 40 MBit angeschlossen sein. Allerdings pustest du so pro Stunde 14 GB ins Netz, oder 10 TB pro Monat. Oh, ich sehe gerade, du willst das auch noch X-mal pro Sekunden schaffen, mehr als 2 ist bei typischen Mietservern wahrscheinlich nicht drinn.
Deswegen ja auch die Beschränkung auf die meinetwegen 20 umliegenden Planeten. Also worst-case alle 1000 Clients online:

1000 Clients * 4Bytes * 20 Planeten = ca. 194 GB pro Monat bei sekündlicher Berechnung. Aber du hast ja recht, bei einer Million Clients und 20 Planeten jeweils zu übertragen werdens schwindelerregende 189 TB <Schluck>
Aber Gott sei Dank ist das noch fernste Zukunftsmusik 8) und es sind ja nie alle Clients online!

Aber wenn mein Projekt was werden sollte, dann wird das irgend wann tum Problem werden. Hoffentlich sind bis dahin die Server günstiger :wink:

Von IronPython halte ich momentan eher nichts. Da kann ich doch direkt C# oder Mono nehmen. Klar wäre wahrscheinlich Java besser, aber wie gehört habe, brauche Java recht performante Server (vor allem in Verbindung mit Project Darkstar).

Ich stelle es mir momentan so vor, den Server in Python zu erstellen und dann die hungrigen Teile zu optimieren und dann mal sehen. Vielleicht hat ja irgendwann ein Nicht-Egomane Lust an dem Projekt mit zu arbeiten, wenns erst mal online ist??
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

"Das skaliert so nicht!(tm)"

Wenn du so eine Datenmenge rumschieben willst, dann dann ist HTTP definitiv eine schlechte Wahl. Und wenn es auch noch Realtime-nah sein soll, kommst du an UDP kaum vorbei: Mölglichst wenig Overhead und verspätet eintreffende oder fehlende Pakete werden verworfen. Das wird dann zwar im Webbrowser schwierig, aber der ist dann auch nicht mehr die richtige Plattform für so einen Client.

Beim weiteren Lesen habe ich auch direkt daran gedacht, die Berechnungen auf dem Client ausführen zu lassen, gerade wenn die Umlaufbahnen voraussehbar sind. Bei einer Simulation ist das allemal egal, bei einem Spiel sollte man dagegen Manipulationen erkennen können, etwa wenn (mal als Beispiel) die Kollision des Raumschiffs des Anwenders mit einem Planeten Nachteile bringt, die man durch Fehlangabem vom Client vermeiden könnte.

Von .NET/C# und was da zugehört halte ich persönlich relativ wenig. Wenn ich mich damit auseinandersetzen wollte, würde ich mir aber wohl zunächst Konsorten wie Boo ansehen.

gerold hat geschrieben:Python ist das Zauberbuch und wir sind die Zauberer.
gerold, meinen Respekt für diesen erstklassigen Spruch. *Den* noch mit einer Simon-the-Sorcerer-ähnlichen Illustration versehen und das gäbe ein absolut hammermäßiges T-Shirt ...
Yogi
User
Beiträge: 80
Registriert: Montag 21. Januar 2008, 16:35
Wohnort: Bonner

@gerold: Das hat mich jetzt sehr weiter gebracht. Danke! Interessant auch, deine Optimierungsreihenfolge. Ich hatte gedacht, direkt mit pyrex zu optimieren, ohne psyco Zwischenschritt.

Wegen der DB, ist das denn keine Bremse, wenn ich andauernd die Daten von der DB hole? Da müsste noch ein Caching her.
Sehr interessant die Aussage, dass man zwischen parallel arbeitenden Programmen Nachrichten übermittlen kann.

@YOGi, oh mist, ich hatte zu spät die relativ gleiche Namensgebung gesehen. Nun ja, musst jetzt damit leben, eine Verwechslung ist ja ausgeschlossen :)

Ich glaube, irgend wo über einen UDP Modul für Flash gelesen zu haben, ansonsten müsste doch erst einmal TCP dran glauben... Am Anfang dürfte das aber kein Problem sein.

Leider kann ich die Berechnungen nicht auf den Clients durchführen lassen. Der Trick ist ja, dass auch wenn die Clients nicht online sind, die Planeten weiter agieren/reagieren. Und vorhersehbar ist leider gar nichts, da sich die Planetenkonstellationen stetig verändern können.

Edit: Was ich vergessen habe zu fragen: Stackless Ja/Nein?
Antworten