text file blockieren während es bearbeitet wird

  • Hallo,


    ich stehe vor einem ziemlich großen Problem.


    Ich möchte Startnummern (Wartenummern) ausgeben an zwei unterschiedlichen Plätzen.


    Dazu benutze ich 3 PI´s


    Der erste ist der Master auf dem ich eine Text Datei freigebe in dem die zuletzt vergebene Startnummer steht.


    Die anderen zwei geben die Tickets aus.


    Das heißt beim drücken einer Taste schaut er am Master Pi nach welche Startnummer er drucken muss und erhöht diese um 1 und speichert sie wieder ab.


    Jetzt kann es passieren das beide Pi´s zur exakt selben zeit in die Textdatei schauen welche Startnummer drin liegt.


    Also das Problem es wird zweimal dieselbe Nummer ausgedruckt.


    Gibt es eine Möglichkeit das die Textdatei gesperrt wird während einer der beiden Pi´s die Nummer ausliest.


    Also wenn der erste gerade liest und die neue Nummer schreibt, dass der eine warten muss?



    Beispiel

    open file "nummer.txt" and BLOCK


    Der Codeteil welcher die Nummer ausliest und um eins erhöht



    Bitte Bitte kann mir jemand weiterhelfen.:helpnew:


    Das ist jetzt seit zwei Tagen in Betrieb und es funktioniert nicht richtig :wallbash:



    DANKE :danke_ATDE:

    • Official Post

    sqlite und autoincrement wäre auch ne möglichkeit, damit kriegst du garantiert ne eindeutige Nummer

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

  • Hallo diode !


    Wenn Du das File zahl.txt rw öffnest, kann kein anderer rw auf das File rw zugreifen.


    Ein Doppelzugriff könnte mit einem zweiten Versuch des gesperrten Users abgefangen werden.




    Servus !

    RTFM = Read The Factory Manual, oder so

  • Ich würde ja schon fast sagen "Broken by Design"... Zum einen finde ich es komisch wieso du überhaupt eine Textdatei frei gibst wenn doch alle 3 Pi's anscheint über Netzwerk verfügen, zum anderen wieso dann mehrere Pi's auf diese eine Datei direkt zugreifen obwohl du doch einen Master hast - und du jetzt die Datei sperren willst...


    Du hast ein Master, welcher die Ticket-Nummer verwalten soll.

    Du hast zwei Clients, welche durch drücken einer Taste etwas ausdrucken sollen.


    Wieso machst du es nicht so dass sich die Clients zum Master via Socket verbinden und nur eine Abfrage ausführen. Der Master erhöht dann nach jeder Abfrage den Zähler. Somit verwaltet dann nur der Master die ominöse Textdatei und ist auch der einzige der darauf zugreift.


    Dh Socket_Server auf dem Master. Die Clients verbinden sich via Socket. Wird am Client-Pi die Taste gedrückt schickt dieser eine Abfrage an den Master, der gibt den aktuellen Zählerstand aus und erhöht diesen zugleich um 1. Wenn du das Master-Script nicht verunstaltest bzw künstlich ausbremst kann es zu keiner doppelten Vergabe kommen.

  • Eleganter wäre sicher ein Remote Procedure Call. Wenn du in Python programmierst, gibts hier eine Liste mit möglichen Ansätzen.


    Das Sperren und Hochzählen in einer Datei ist wohl eher eine amateurhafte Lösung.

    Wenn sich nun wirklich keine Möglichkeit findet, die Datei zu sperren, dann könntest du sie umbenennen.

    Client 1 benennt die Datei um "Nummer.txt" > "Eins.txt"

    Jetzt kann kein anderer sie noch kopieren.

    Client 1 vergibt die nächste Zahl und aktualisiert die Datei.

    Client 1 benennt die Datei wieder um "Eins.txt" > "Nummer.txt"


    Bei Fehler "file not found" müssen die Clients einen kurzen Moment warten und es nochmal probieren.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

    Edited once, last by Gnom ().