Leser: 25
1
2
3
4
5
6
7
8
9
10
# Advisory locking
use Storable qw(lock_store lock_nstore lock_retrieve)
lock_store \%table, 'file';
lock_nstore \%table, 'file';
$hashref = lock_retrieve('file');
[...]
The "lock_store" and "lock_nstore" routine are equivalent to
"store" and "nstore", except that they get an exclusive lock on
the file before writing. Likewise, "lock_retrieve" does the same
as "retrieve", but also gets a shared lock on the file before reading.
QuoteWenn du allerdiengs auf einen Linux System (generell Unix Systeme) arbeitest
kannst du rein theoretisch durch temp datei schreiben / rename es auch so hinbiegen
das du ohne locking immer wieder lesen kannst ohne in probleme zu rennen.
QuoteLocking beim Lesen brauchst du nur dann wenn du die Datei nachträglich änderst und neu schreibst.
Weil du dann genau dann einen Moment beim auslesen erwischen kannst wenn du die Datei neu schreibst.
2009-10-01T09:05:29 tobyMeine angedachte Vorgehensweise nach Tipps von pq war lock_nstore() beim A.pl und lock_retrieve() bei B.pl. Da ich mich aber mit dem Lock- und Store-Verhalten bei unabhängigen, parallelen Zugriffen nicht auskenne habe ich nun doch noch folgende Sorgen:
QuoteWas macht A.pl, wenn es schreiben möchte und die Datei gerade vom B.pl für Lesen ge'lock'ed ist? Der deamon (A.pl) darf nie Probleme haben über die Datei zu verfügen,
QuoteNatürlich wäre es am schönsten, wenn weder A.pl noch B.pl Probleme bekommen. Da ich aber nicht weiss, wie sich gleichzeitiges lock_retrieve() vom B.pl und lock_nstore() vom A.pl verhält, ist mein aktueller Plan lock_nstore() bei A.pl und normales retrieve() bei B.pl mit der Gefahr, dass B.pl evtl. zerschnittene Daten erhält. Was meint ihr darüber?
Quote=> Wenn A.pl mit lock_nstore() wartet, bis lock_retrieve() von B.pl fertig ist, wäre alles OK, wie läuft es aber tatsächlich ab? Wie gesagt, das Wichtigste ist, dass A.pl problemlos reinschreiben darf!
2009-10-01T09:55:31 toby> hast du perldoc -q lock gelesen?
Nur perldoc Storable. Hier hat mich aber das Verhalten beim parallele Zugriff von zwei komplett unabhängigen Programmen verunsichert.
QuoteIch arbeite nur unter Unix (HP-UX). Mein erster Gedanke war aus B.pl mir die Datei wegzukopieren und dann die Kopie auszulesen und anschliessend wegzuschmeissen. Dies ist zwar sicher, erschien mir aber zu umständlich und wollte wissen, ob es direkt mit Perl-Board-Mitteln geht.
QuoteDas eine Programm A.pl (daemon) schreibt kontinuierlich, aber ungegelmäßig rein. Das andere, parallele Programm B.pl liest die Datei nur ab und zu aus, um den aktuellen Zustand für andere Zwecke auszuwerten.
QuoteMeine angedachte Vorgehensweise nach Tipps von pq war lock_nstore() beim A.pl und lock_retrieve() bei B.pl. Da ich mich aber mit dem Lock- und Store-Verhalten bei unabhängigen, parallelen Zugriffen nicht auskenne habe ich nun doch noch folgende Sorgen:
QuoteWas macht A.pl, wenn es schreiben möchte und die Datei gerade vom B.pl für Lesen ge'lock'ed ist?
QuotePS: lock_store(), oder lock_nstore() ? Wo ist der Unterschied???