Thread Storable->retrieve parallel aus einem weiteren Programm? (12 answers)
Opened by toby at 2009-09-30 15:28

sid burn
 2009-10-02 10:20
#126413 #126413
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Quote
Ich 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.

Mit Kopieren hat das nichts zu tun. Was ich meinte ist folgende vorgehensweise. "dateia" nutzen derzeit alle zum auslesen. Dein Programm schreibt neue Daten ersteinmal in "dateib". Nachdem es fertig ist benennst du "dateib" nach "dateia" um. Um es kurz zu halten. Soetwas stellt unter Unix ähnlichen Betriebssystem kein Problem dar, unter Windows würde dies nicht gehen.

Der andere Punkt war einfach nur ein Hinweis das wenn du "immutable" dateien hast (Dateien die sich nicht verändern). Dann brauchst du auch kein locking. Das ist als Antwort darauf weil du fragtest ob es Probleme gibt wenn zwei Programme gleichzeitig eine Datei lesen. Lesen generell stellt kein Problem dar. Probleme gibt es immer nur dann wenn du Änderungen erlaubst bzw. gleichzeitig Liest/Schreibst. Dann musst du mit Locking arbeiten.

Quote
Das 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.

Somit kann es einen Moment geben wo gleichzeitig gelesen/geschrieben wird. Daher um es einfach zu halten solltest du Locking nutzen. Erstes was ich aber schrieb geht auch.

Vorteil wäre das du kein Locking hast, und du damit wirklich Parallel arbeitest. Mit Locking greift immer nur einer gleichzeitig auf die Datei zu.

Allerdiengs spielt das wenn du nur selten auf die datei zugreifst sowieso alles keine Rolle und von der vorgehensweise ist es simpler einfach das locking prinzip zu nutzen.

Wo es eine Rolle spielen würde wäre wenn du hunderte abfragen pro sekunde hättest. Dann wäre es aber sinvoller wohl gleich ein TCP/IP Server aufzubauen anstatt es über das I/O zu machen.

Quote
Meine 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:

Naja Locking ist ja gerade dafür da wegen "Paralleln" Zugriff, wenn du kein Parallelen zugriff hättest brauchst du auch kein Locking.

Quote
Was macht A.pl, wenn es schreiben möchte und die Datei gerade vom B.pl für Lesen ge'lock'ed ist?

Er wartet solange bis er den Lock bekommt und schreibt dann, sprich dein Programm stoppt, sofern du kein "non-blocking lock" machst.

Quote
PS: lock_store(), oder lock_nstore() ? Wo ist der Unterschied???


Storable speichert Daten Binär ab. Unterschiedliche Architekturen haben sogenannte BigEndian oder LittleEndian, das gibt an wie Bits zu Interpretieren sind. Nutzt du nur "lock_store" dann wird das Verfahren deiner Maschiene genutzt.

Wenn du Daten aber mit Storable z.B. über Rechner hinweg austauscht, Sprich über Netzwerk etc. dann ist es ziemlich nachteilig wenn ein Rechner in LittleEndian Speichert und der andere es als BigEndian versucht zu interpretieren, das läuft dann schief.

Das "n" gibt an das du die Netzwerkordnung nutzen möchtest. Daher Daten sind auch über Systeme austauschbar die das eine oder das andere verfahren nutzen.

Für genaueres kannst du das hier lesen: http://de.wikipedia.org/wiki/Byte-Reihenfolge
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de

View full thread Storable->retrieve parallel aus einem weiteren Programm?