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:

  • 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!

    Einmal editiert, zuletzt von Gnom (17. Februar 2018 um 16:13)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!