ja gut das mit dem flag war nur so dahingesagt ^^
was wäre nun "sinnvoller" (wenn wir von dem standpunkt ausgehen: session selber machen): "session-daten" in textfile oder in datenbank ablegen?
(Themenstarter)
![]() Anmeldungsdatum: Beiträge: 880 Wohnort: Thüringen |
ja gut das mit dem flag war nur so dahingesagt ^^ was wäre nun "sinnvoller" (wenn wir von dem standpunkt ausgehen: session selber machen): "session-daten" in textfile oder in datenbank ablegen? |
||
![]() Anmeldungsdatum: Beiträge: 1130 |
Führt man diesen Code aus wird |
||
(Themenstarter)
![]() Anmeldungsdatum: Beiträge: 880 Wohnort: Thüringen |
ich bastel gerade an einer version die lokal speichert und prüfe vorher rekursiv das dict/tupel/liste ob elemente enthalten sind die vom type nicht dict,tuple,list,str,bool,long,int,float sind. falls ein nicht passendes element gefunden wird, wird nicht gespeichert etc. aber das behebt das von dir genannte problem nicht wirklich :-S was, wenn ich mir für "primitive" datentypen (auch wenn selbst int etc objekte sind) mir ein eigenes konstrukt zum speichern von werten in einer datei schreibe? quasi nen pickle, was keinen code ausführt O_o |
||
![]() Anmeldungsdatum: Beiträge: 2669 Wohnort: Hamburg |
Was spricht denn gegen JSON? Da besteht das Problem erst gar nicht... |
||
(Themenstarter)
![]() Anmeldungsdatum: Beiträge: 880 Wohnort: Thüringen |
Ich habe es ja nicht ausgeschlossen. Angenommen ich verwende JSON. Dann bliebe mir theoretisch das Problem Race Condition. Könnte ich ähnlich wie aptitude lösen und für jede Session eine "SESSIONID.lock"-file zum Sperren der Sitzung (wenn sie im Code geöffnet wird) verwenden? Beim speichern&schließen würde dann die file gelöscht werden. Wenn die Session gesperrt ist, würde das Skript einige ms warten und hoffen, dass die Sitzung dann nicht mehr gesperrt ist - oder nach einigen Versuchen bricht es mit Errormessage "timeout while accessing to session" ab etc.? Welche Probleme würde das mit sich bringen? Das ist erstmal so ne spontane Idee... /EDIT: Anbei muss ich sagen, die Benutzung von JSON ist sehr intuitiv.
|
||
![]() Anmeldungsdatum: Beiträge: 2669 Wohnort: Hamburg |
Und bei pickle wäre das nicht der Fall? ❓ Schau Dir doch mal die Lösung aus werkzeug an! Ich habe da doch ziemlich viel verlinkt. Bei mkstemp() steht eben in der Doku dabei, dass keine Race Condition auftreten kann. Nur beim rename() muss man wohl für Windows-Systeme einen Workaround via MonkeyPatch bauen. Aber den kannst Du ja zur Not kopieren. |
||
Anmeldungsdatum: Beiträge: 29567 |
Hallo, nimm' doch für's speichern ein KV-Store wie Redis. Das ist rasend schnell und atomar. Oder halt Flask bzw. Werkzeug. Eines der schönen Dinge an Python ist ja, dass man oft das Rad nicht neu erfinden muss. 😉. Gruß, noisefloor |
||
(Themenstarter)
![]() Anmeldungsdatum: Beiträge: 880 Wohnort: Thüringen |
wie kommst du darauf??
wie du sicher mitbekommen hast oder mitbekommen haben solltest, möchte ich so eine struktur selber machen. werkzeug zu nutzen wäre die - ich sag mal ohne es in ein falsches licht zu rücken - Notlösung für mich. wie gesagt: es geht hier um ansätze und ideen soetwas selber zu implementieren. Frage:
Würde das Race Conditions eindämmen / verhindern? Die Idee der lock-file habe ich von apt-get - dort wird augenscheinlich eine lock-file verwendet, damit kein weiter paketverwaltender prozess gestartet werden kann... |
||
![]() Anmeldungsdatum: Beiträge: 2669 Wohnort: Hamburg |
Weil Du in dem von Dir referenzierten Posting doch sagst, dass Du bei JSON mit den Race Conditions zu kämpfen hättest 😉 Das impliziert doch, dass Du davon ausgehst, dass Du dieses Problem bei pickle nicht gehabt hättest. Aber augenscheinlich ist es Dir doch klar und damit erledigt ☺
Wie Du selber mitbekommen haben solltest - es aber augenscheinlich nicht hast -, kannst Du Dir doch die Inspiration bei werkzeug holen! Hättest Du Dir den Code mal angeguckt, wie ich es habe, dann hättest Du doch die wichtigen Aspekte aufgeschnappt. Selber implementieren =! eigene Idee 😉 Und wenn es eine gute Lösung gibt, dann muss man eben schon mal hinterfragen, ob die eigene besser ist. Offensichtlich versuchst Du mit der Brechstange Dinge zu erreichen, ohne tiefere Kenntnisse der Materie zu haben.
Inwiefern sollte er? Wie wir erfahren haben, schützt open() nicht davor. Insofern gewinnst Du auch nichts durch eine Lock-Datei. Nebenbei kann man json direkt in ein file Objekt dumpen; dumps() ist also in dem Falle umständlich. |
||
(Themenstarter)
![]() Anmeldungsdatum: Beiträge: 880 Wohnort: Thüringen |
Das ist deine Interpretation; ich habe das Thema Race Conditions nur erstmal nach hinten geschoben - beheben muss ich es bei beiden. Btw. verwendet mein Testskript nun json statt pickle 😉
Es geht nicht um "besser" oder "schlechter" sondern in erste Linie um Erfahrungsgewinnung. Denke mehr muss ich dazu nicht sagen. Die Anspielung bzgl. Kenntnissen bitte ich dich zu unterlassen; ich denke diese Diskussion hatten wir beide schon mehr aus ausführlich...
In meiner Idee kommt es zu keinem open() und Laden der daten, wenn die lock-file existiert. Wäre das dumpen mittels json denn atomar? |
||
![]() Anmeldungsdatum: Beiträge: 2669 Wohnort: Hamburg |
Das ist nicht meine Interpretation, sondern die Semantik hinter dieser Aussage! bliebe ist hier das entscheidende Wort.
Doch, es geht bei Lösungen auch um besser oder schlechter. Da beides keine guten Metriken sind, muss man sich das aus Dingen wie Sicherheit, Robustheit, Laufzeit usw ableiten. Oder besser formuliert: Durch das Vergleichen der eigenen Lösung mit fremden lernt man ja erst etwas. Manchmal kann das auch dazu führen, seine eigene Lösung zu verbessern, so dass diese bei der Bewertung aufsteigt.
K.A. was Du da meinst. Ich habe nur deutlich gemacht, dass ich Deine Ignoranz und Deinen Widerwillen gegenüber gegebenen Tipps nicht nachvollziehen kann. Klar musst Du diese nicht annehmen und Du kannst Dir auch denken "LMAA mit diesem werkzeug-Code", aber da Du ja ausdauernd Fragen stellst, die zum Problem der Race Condition zurückkehren, kann man ja nur erneut auf diese Tipps verweisen. Zudem glaube ich einfach nicht, dass Armin diese Lösung einfach zugeflogen ist. Auch er wird da recherchiert haben, um das Problem mit Windows-OS zu lösen. Wieso also nicht darauf zurückgreifen? Klar kann man das Rad neu erfinden, aber manchem gelingt das auch nicht. Solange man etwas bereits erforschtes Nachvollziehen kann, langt das durchaus hin. Ansonsten lebten wir alle noch auf Bäumen 😉 Und da Dir - und mir auch - das Problem mit Race Conditions bei der open()-Funktion von Python unbekannt waren, darf man hier wohl von mangelnden Kenntnissen sprechen, oder?
Ja und wie legst Du das dan? 😉
Jein, da Du ja ein File-Objekt übergeben musst, hängt das also dann wiederum davon ab, wie Du das Erstellen löst. |
||
(Themenstarter)
![]() Anmeldungsdatum: Beiträge: 880 Wohnort: Thüringen |
Zunächst prüfe ich mittels os.path.isfile(filename) ob die lock-file existiert. Wenn ja, wird gewartet und erneut versucht bis die lock-file weg ist oder der Zähler zu hoch ist und eine Exception geraised wird. wenn die lock-file dann mal weg ist wird sofort eine neue lock-file erstellt und die session daten aus der dat-file geladen. das ganze steht im konstruktor meiner session klassen (sofern eine sid angegeben ist, sonst wird einfach eine neue erstellt etc. pp.) zur laufzeit der session instanz können die daten manipuliert werden etc. der destruktor speichern die daten dann ab und entfernt zum schluss die lock-file. so sollte eigentlich gewährleistet sein, dass kein zweiter zugriff auf die session geöffnet werden kann (sofern ich jetzt nicht eine neue sid erzeuge und dann zur laufzeit die interne sid der session ändere um das speicherziel zu manipulieren) verständlich? |
||
![]() Anmeldungsdatum: Beiträge: 2669 Wohnort: Hamburg |
Und wie stellst Du das sofort sicher? 😉 Könnte doch sein, dass zwischen dem Test und dem Erstellen die Datei von einem anderen Prozess angelegt wurde. Und schon ist das Problem wieder da...
Was ist der Destruktor? |
||
(Themenstarter)
![]() Anmeldungsdatum: Beiträge: 880 Wohnort: Thüringen |
Genau das ist mein Problem^^
def __del__ |
||
![]() Anmeldungsdatum: Beiträge: 2669 Wohnort: Hamburg |
Und genau das hättest Du ja anhand der Tipps lösen können 😉
Hui... du hast mal das OpenBook von Galileo gelesen, richtig? Vergiss den mal schön, anders als in C++ sollte man den Destruktor in Python meiden. |