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.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Sonntag 27. Januar 2008, 11:48

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Sonntag 27. Januar 2008, 13:08

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
:-)
[url]http://halvar.at[/url] | [url=http://halvar.at/elektronik/kleiner_bascom_avr_kurs/]Kleiner Bascom AVR Kurs[/url]
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

Sonntag 27. Januar 2008, 13:33

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

Sonntag 27. Januar 2008, 14:15

"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

Sonntag 27. Januar 2008, 14:41

@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?
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Sonntag 27. Januar 2008, 15:09

Wenn Dich Englisch nicht schreckt, könnte Dir vielleicht Game Programming with Python eine Hilfe sein. Hier werden viele grundlegende Dinge der Spieleprogrammierung mit Python abgehandelt, u.a. auch Online-Spiele. Es ist zwar nicht ganz billig, bei caiman_amerika aber neu zum halben Preis (28,38 €) erhältlich.
MfG
HWK
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Sonntag 27. Januar 2008, 18:48

Oh, das Werk habe ich hier sogar liegen. Mal für ~15 € bei Amazon zShops geschossen. Dauert 'n paar Wochen, bis es aus Amerika/Australien/whatever da ist, aber man spartsehr viel Geld.
Yogi
User
Beiträge: 80
Registriert: Montag 21. Januar 2008, 16:35
Wohnort: Bonner

Sonntag 27. Januar 2008, 20:05

Von Oktober 2003, ist das noch aktuell genug? War damals nicht Python 2.1 oder sowas? Vielleicht bräuchte ich ja mehr so ein generelles Netzwerk Grundlagenwerk?? Gibt ja noch ein neueres Werk... Beginning Game Development with Python and Pygame: From Novice to Professional (Expert's Voice)
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Sonntag 27. Januar 2008, 20:47

Yogi hat geschrieben:...Vielleicht bräuchte ich ja mehr so ein generelles Netzwerk Grundlagenwerk??...
Das hier fand ich ganz toll: Foundations of Python Network Programming
MfG
HWK
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 27. Januar 2008, 22:48

HWK hat geschrieben:
Yogi hat geschrieben:...Vielleicht bräuchte ich ja mehr so ein generelles Netzwerk Grundlagenwerk??...
Das hier fand ich ganz toll: Foundations of Python Network Programming
Ohne das Buch gelesen zu haben würde ich sagen, dass ein Buch zu TCP/IP an sich schon sehr brauchbar sein kann, da Pythons ``socket``-Modul BSD-sockets nachempfunden ist und somit viele Dinge übertragbar sind. Natürlich, es gibt noch Asyncore/Medusa und Twisted, aber so viel tut sich in der Richtung nicht.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Yogi
User
Beiträge: 80
Registriert: Montag 21. Januar 2008, 16:35
Wohnort: Bonner

Sonntag 27. Januar 2008, 23:00

Jo! das klingt wirklich gut. Das gehört wohl unter mein Kopfkissen...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Dienstag 5. Februar 2008, 11:55

gerold hat geschrieben:Man kann auch mehrere Datenbankserver im Multimaster-Betrieb zusammenschließen.
Z.B. damit:

http://bucardo.org/

lg
Gerold
:-)
[url]http://halvar.at[/url] | [url=http://halvar.at/elektronik/kleiner_bascom_avr_kurs/]Kleiner Bascom AVR Kurs[/url]
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

Montag 24. März 2008, 11:50

Hi, ich dachte ich mache keinen neuen Thread auf, sondern ergänze den bestehenden.

Also, ich bin in meinem Ski-Urlaub fleissig gewesen und habe den Prototypen fertig gestellt. Es ist gut zu wissen, dass meine Idee nicht nur spinnert ist, sondern auch tatsächlich funktioniert, auch wenn ich für die visuelle Darstellung für 1000 Clients überdenken muss, da ist dann einfach zu viel los auf dem Screen. Aber das ist ganz gut, dann kann ich mit einem vernünftigen LOD, Ausblendung weiter entfernter oder nicht im Sichtfeld befindlicher Clients auch die Datenmenge schön reduzieren.

Aber jetzt wird echt happig, ich möchte jetzt alles Client-Server mässig in Python umsetzen. Und obwohl ich schon reichlich gelesen habe über Frameworks etc., bin ich kein bisschen schlauer. Immer, wenn ich denke ich habe eine Kombi, dann gibt es Stimmen, die sagen, neeee, bloss das nicht, nimm lieber das und das.... ich blick da nicht mehr durch.

Aus Kostengründen möchte ich gern erst einmal ein Server-System zu Hause aufsetzen, bevor ich einen dedicated miete.

Da wäre also erst einmal die OS Frage zu klären. Ich halte Debian 4 für eine gute Wahl, muss mich da aber erst einmal einlesen. Am liebste würde ich gerne während der anfänglichen Entwicklung unter Windows bleiben, sofern das möglich ist.

Als Datenbank MySQL.

Als Server dachte ich an CherryPy, weil das anfangs einfacher einzurichten sein soll und weil ich später Apache vorschalten kann.

Bei Apache habe ich Sorge vor den Konfiguration und den Sicherheitslücken.

Als ORM für die Datenbank dachte ich an SQLAlchemy oder Storm.

Als Templating System dachte ich an Mako oder sogar Cheetah. Da ich anfänglich die Auswertung browserbasiert haben möchte, kann ich mit XML Systemen wie Genshi nichts anfangen.

Tja und was die UDP und TCP betrifft dachte ich erst an Twisted, aber ich habe schon mehrfach lesen müssen, dass das eine ziemlich steile Lernkurve besitzt. Was gibt es noch als Alternative?


Bei allen Paketen sollte gelten, einfach in der Anwendung aber belastbar und bewährt.

Eine weitere Frage ist auch, ist es sinnvoll zwei Server zu benutzen? Der eine für das User-Management etc. und der andere für die Berechnungen und die Übermittlung der Daten für die visuelle Darstellung an die Clients.
Dann könnte ich einen normalen, gewarteten Server nehmen und einen dedicated als zweiten, der dadurch sicherer ist, dass keine Clients darauf zugreifen. Geht das überhaupt? Client sendet und empfängt von Server 1, aber empfängt nur von Server 2. Die Daten von Server2 nach Server1 und dann zum Client dürfte wohl zu lange dauern, oder?

Was meint ihr dazu?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 24. März 2008, 12:08

Yogi hat geschrieben:Da wäre also erst einmal die OS Frage zu klären. Ich halte Debian 4 für eine gute Wahl, muss mich da aber erst einmal einlesen. Am liebste würde ich gerne während der anfänglichen Entwicklung unter Windows bleiben, sofern das möglich ist.
Jo, aber dann darfst du auch keine besondere Performance erwarten.
Yogi hat geschrieben:Als Datenbank MySQL.
Postgres. Spätestens wenn du Tabellen bearbeitest, deine Datenbank replizieren willst etc. wirst du bereuen es nicht zu verwenden.
Yogi hat geschrieben:Als Server dachte ich an CherryPy, weil das anfangs einfacher einzurichten sein soll und weil ich später Apache vorschalten kann.
Und allen bereichten nach skaliert es nicht. Nimm etwas anderes.
Yogi hat geschrieben:Bei Apache habe ich Sorge vor den Konfiguration und den Sicherheitslücken.
So schwer ist Apache nicht einzurichten (verglichen etwa mit der ätzenden Konfiguration von Lighty) und auf Debian gibt es Sicherheitsupdates dafür. Die letzte korrigierte Sicherheitslücke in Apache 2 war laut Security Archiv im August 2006, also sogar vor dem Release von Etch.
Yogi hat geschrieben:Als ORM für die Datenbank dachte ich an SQLAlchemy oder Storm.
Würde wohl zu SQLAlchemy raten. Es ist sicherlich komplizierter, aber kann auf lange sicht gesehen mehr (u.a. Sharding).
Yogi hat geschrieben:Als Templating System dachte ich an Mako oder sogar Cheetah. Da ich anfänglich die Auswertung browserbasiert haben möchte, kann ich mit XML Systemen wie Genshi nichts anfangen.
Mako, das ist schneller und recht gut betreut, vom gleichen Autor wie SQLAlchemy. Ich sehe allerdings dein Problem mit Genshi nicht, an welche Stelle stört dich XML?
Yogi hat geschrieben:Tja und was die UDP und TCP betrifft dachte ich erst an Twisted, aber ich habe schon mehrfach lesen müssen, dass das eine ziemlich steile Lernkurve besitzt. Was gibt es noch als Alternative?
asynchat/asyncore, Medusa, Allegra, Kamaelia.
Yogi hat geschrieben:Bei allen Paketen sollte gelten, einfach in der Anwendung aber belastbar und bewährt.
Manchmal muss man eben Kompromisse eingehen.
Yogi hat geschrieben:Die Daten von Server2 nach Server1 und dann zum Client dürfte wohl zu lange dauern, oder?
Schätze das hängt von der Netzwerkanbindung zwischen den Servern ab.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Montag 24. März 2008, 13:21

@Yogi: Zu dem "jeder sagt was anderes" würde ich sagen: Fang erst einmal an und geh' davon aus, dass Du eh eine Menge 2 bis 3mal neu schreiben wirst, wenn das alles noch komplettes Neuland für Dich ist.

Du könntest zum Beispiel erst einmal auf CherryPy aufsetzen und das Wissen, dass Du den Server später vielleicht noch einmal wechseln wirst, dazu nutzen die Logik sauber vom Rest zu trennen.
Antworten