Den Server rechnen lassen (allgemeine Frage) zu Bottle

Django, Flask, Bottle, WSGI, CGI…
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

BlackJack hat geschrieben:@DanJJo: Ein Punkt sieh für Dich gleich aus wie zwei Punkte? '.' ist das aktuelle Verzeichnis und '..' ist ein Verzeichnis *über* dem aktuellen Verzeichnis.

oh ich dachte "././" das wäre das *über* nun ja ok dann liegt die Sache fast auf der Hand. Gibts einen guten Weg relative Pfade immer von dem Aktuellen standort zu bestimmen ? sprich ich bin in ./bla bitte bestimme mir den pfad zu ./blub/blob/datei ?
BlackJack

@DanJJo: Ich weiss immer noch nicht was Du meinst. Du kannst Pfade entweder absolut oder relativ zum aktuellen Arbeitsverzeichnis angeben. Du bist in ``./blah/`` macht als Aussage keinen Sinn, bzw. was bedeutet denn hier „sein”? Relativ gesehen bist Du immer in ``./`` und was das als absoluter Pfad bedeutet, hängt halt vom aktuellen Arbeitsverzeichnis ab.

Ich habe da so die Ahnung Du willst Pfade fest in den Quelltext schreiben. Vielleicht solltest Du das einfach sein lassen und eine Konfigurationsdatei oder Umgebungsvariablen verwenden um die Pfade flexibler angeben zu können.
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

BlackJack hat geschrieben:@DanJJo: Ich weiss immer noch nicht was Du meinst. Du kannst Pfade entweder absolut oder relativ zum aktuellen Arbeitsverzeichnis angeben. Du bist in ``./blah/`` macht als Aussage keinen Sinn, bzw. was bedeutet denn hier „sein”? Relativ gesehen bist Du immer in ``./`` und was das als absoluter Pfad bedeutet, hängt halt vom aktuellen Arbeitsverzeichnis ab.

Ich habe da so die Ahnung Du willst Pfade fest in den Quelltext schreiben. Vielleicht solltest Du das einfach sein lassen und eine Konfigurationsdatei oder Umgebungsvariablen verwenden um die Pfade flexibler angeben zu können.

OK how to "konfigurationsdatei"? gibts da ein tut ? :mrgreen:
BlackJack

@DanJJo: Es gibt Module wie `ConfigParser` oder `json` in der Standardbibliothek.
Benutzeravatar
snafu
User
Beiträge: 6744
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

DanJJo hat geschrieben:Gibts einen guten Weg relative Pfade immer von dem Aktuellen standort zu bestimmen ? sprich ich bin in ./bla bitte bestimme mir den pfad zu ./blub/blob/datei ?
Das wäre zu kompliziert und fehleranfällig. Besser ist es, bei mehreren ähnlichen Pfaden einen gemeinsamen Basispfad festzulegen und dann mittels `os.path.join()` die Pfade für die darunterliegenden Ebenen zusammenzusetzen. Und wenn eine einzelne Datei mal ganz woanders im Dateisystem liegt, dann sollte man in diesen Fällen natürlich direkt den kompletten Pfad angeben.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Hab jetzt nicht den ganzen Thread durchgewühlt - trotzdem den Eindruck, dass hier mit Kanonen auf Spatzen geschossen wird.

@OP:
Wofür brauchst Du das? Musst das gut skalierbar sein? Falls Du das nur gelegentlich brauchst und Deine Hauptsorge nur die Responsivität der einzelner seltener Anfragen ist - pack die Aufgaben in eine Queue und schick sie an Workerthreads in Deinem bottle-Skript. Beachten musst Du dann, dass Du bottle multithreaded betreibst (z.B. mittels mod_wsgi im Dämonmodus und nicht mit forking). Das sollte für ein paar längere Rechnungen ausreichend sein und ist viel schneller zu implementieren. Über separate Workerdämonen würd ich nachdenken, wenn die Berechnungen >12h/Tag laufen oder hunderte Leute das Frontend brauchen.
BlackJack

@jerch: Da verlässt man sich dann aber stark darauf wie das ganze am Ende ausgeführt wird. Man nimmt wesentlich mehr an, als eine WGSI-Anwendung garantiert bekommt. Das ist hier ja nicht nur eine theoretische Überlegung: momentan steht `mod_wsgi` gar nicht zur Debatte weil das am Ende bei Uberspace über FastCGI laufen müsste.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@BlackJack: Das mit Uberspace hatte ich uberlesen und kenne auch nicht deren Hostingmöglichkeiten. Und mod_wsgi ist ja nur ein Bsp. eines multithreadfähigen Adapters.

Aber wie ist es bei Uberspace um die Langlebigkeit von Prozessen gestellt? Die Telekom hat bei einem mittleren Hostingpaket noch vor 2 Jahren alles gekillt, was nicht bei 3 fertig war. Wir hatten da mal ziemlich Stress mit einem Kunden, der partout an der Telekom als Hoster festhalten wollte. Weiss leider den Paketpreis nicht mehr, war aber recht teuer für das was geliefert wurde aus damaliger Sicht.
BlackJack

@jerch: Man kann/darf dort lang laufende Prozesse starten. Sie bieten die daemontools zum Verwalten von eigenen Diensten/Daemons an. Und wenn man zum Beispiel so etwas wie CouchDB oder MongoDB haben möchte, dann haben sie da etwas vorbereitet, was jeder selber als Daemon laufen lassen kann/muss. Und anstelle von `cron` stehen die eher auf `runwhen`, was auch ein Dienst ist, den der Benutzer starten und dauerhaft laufen lassen muss.

Gekillt wird nur was dauerhaft viel Last erzeugt. Beziehungsweise laut Webseite erst ein `nice`, dann ein Pausieren und jeweils Benachrichtigung des Kunden, und erst wenn der nicht reagiert ein `kill`. Also ob man da Seti@Home oder Mining nach Bitcoins laufen lassen kann, wage ich mal zu bezweifeln. Das ist aber sicher auch nicht der Sinn von Shared Hosting.
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

Also die Kanone ist fertig...deswegen ist es mir egal ob Sie zu überdimensionirt für Spatzen ist :mrgreen: ... mal spaß bei Seite...Ich hab ein Problem.

Die letzten Tage hab ich etwas mit dem Daemon rumgespielt, Ihn laufen lassen dann pausiert und als "server" (python daemon.py) laufen lassen, um mehr Übersicht über gewisse Vorgänge zu haben. Zwischendurch sind ein paar Fehlermeldungen / Abstürze gekommen, was man halt so beim programmieren kennt. Nun ist es heute so, dass wenn ich meinen Webserver starte und etwas übergebe es sage und schreibe "153.596383095" sekunden dauert (sonst so 15-16 sek) bis er die TCP verbindung zum "als Server" laufenden Daemon aufgebaut hat !!! auch weitere Verbindungen (im daemon prozess), welche getätigt werden, laufen schleppend oder bekommen ein "IOError: [Errno socket error] [Errno 110] Connection timed out", sodass ich befürchte, dass irgendwo ein Port oder eine TCP verbindung Offen ist oder was auch immer, welche dort nicht sein darf. Kann ich da irgendwie etwas heraus finden? :mrgreen: Mein betriebssystem ist Ubuntu und ich hab schon in die Netzwerdiagnose (port-scan auf local host) geschaut und nichts "a-normales" festgestellt. "netstat -tulpen" liefert auch nichts...hmmm hoffentich ist nix kaputt :|
BlackJack

@DanJJo: Kann es sein, dass Du das Serversocket blockierst solange eine Berechnung durchgeführt wird?
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

BlackJack hat geschrieben:@DanJJo: Kann es sein, dass Du das Serversocket blockierst solange eine Berechnung durchgeführt wird?

:K nicht das ich wüsste. Ich hab nichts verändert seit gestern. Wie kann ich das denn überprüfen oder besser gefragt wie würde ich es den blockieren ? momentan benutze ich das system alleine und überlaste es nicht mit mehreren anfragen gleichzeitig.
BlackJack

@DanJJo: Es würde blockieren wenn in der Schleife in der das `accept()` gemacht wird nach einem `accept()` die Methode erst wieder aufgerufen wird, wenn die Anfrage komplett bearbeitet wurde.
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

BlackJack hat geschrieben:@DanJJo: Es würde blockieren wenn in der Schleife in der das `accept()` gemacht wird nach einem `accept()` die Methode erst wieder aufgerufen wird, wenn die Anfrage komplett bearbeitet wurde.
wie eine Seite vorher im Code beschrieben ist dort eine Queue, welche die Anfragen abarbeitet. D.h, dass accept die Anfrage animmt und in die Queue packt und weitere annehmen kann. Da ich aber momentan alleine daran arbeite und immer warte bis er fertig ist, da mich das erg. interessiert ist es doch sowieso egal, ob er geblockt wird (was er ja nicht wird ^^)
Sonst noch Ideen ? :|
Antworten