Grundkonzeptfrage zu meinem Watchfolderproblem von gestern
Verfasst: Donnerstag 10. April 2008, 14:59
Nachdem ich gestern ja hier in dem Thread http://www.python-forum.de/topic-14206.html ja ne recht banale Frage hatte, kam neben der sehr schnellen Beantwortung dieser Frage auch ne Anmerkung bezueglich "Polling ist nicht so ne tolle Loesung", usw. Da das in dem anderen Thread aber eher nebensaechlich war und ich nicht ausfuehrlich erklaert habe worum es geht, versuche ich das hier jetzt nochmal. Einfach in der Hoffnung dass ich da von Euch vielleicht auch konzeptionell und nicht "nur" bei der Suche nach nem bestimmten Kommando noch Input bekomme und da was lernen kann
Hier mal meine Ausgangsaufgabenstellung:
ich arbeite im Film-Postproduction-Bereich, mache also digitale Effekte fuer Kinofilme. Hauptarbeitsmittel ist da ein grosser SAN-Storage, auf den verschiedenste Workstations (hauptsaechlich Macs) und ne Renderfarm zugreifen. Auf dem Storage liegen vor allem viele Ordner mit Einzelbildsequenzen drin.
Um die Highres-Bildsequenzen in Echtzeit anschauen zu koennen gibt es parallel dazu einen zweiten Rechner (Windows), der nen eigenen, sehr schnellen RAID-Storage hat, von dem er abspielt.
Was passieren soll ist jetzt folgendes. Die Renderfarm rechnet ne Bildsequenz, die in nem Ordner auf dem SAN landet. Diese Daten sollen jetzt nachdem sie fertig gerendert sind auf den Playbackrechner kopiert werden. Problem dabei ist: es darf nur in dem Moment kopiert werden in dem der Playbackrechner gerade nicht auf "Play" steht. Denn wenn parallel geschrieben wird ist nicht mehr zuverlaessig ein Realtime-Playback moeglich. Als Hilfsmittel, damit man weiss wann das Teil nen Playback macht, wird automatisch auf der Festplatte eine versteckte Datei (.play) angelegt, die sofort geloescht wird wenn man in der Software wieder auf "Stopp" geht.
Mein Grundkonzept sieht deshalb momentan folgendermassen aus:
1. Nach nem erfolgreichen Rendervorgang wird von der Renderfarm ein aufsteigend durchnummeriertes Textfile angelegt, das einfach den vollstaendigen Pfad zum jeweiligen zu kopierenden Ordner enthaelt.
2. Auf dem Playbackrechner hab ich mir jetzt ein Skript geschrieben, das in erstmal einfach aus ner while True-Endlosschleife besteht. Diese schaut erstmal nach ob .play gerade existiert. Wenn ja, warte ich mit sleep ein paar Sekunden und schau dann wieder nach.
3. wenn .play nicht existiert, schaue ich ob in dem Watchfolder Dateien drinliegen. Wenn ja, lese ich deren Namen per glob in ne Liste und arbeite dann jedes File ab.
4. dazu lese ich den Pfad aus den Dateien aus, lese mit glob den Inhalt des Pfadordners aus (sprich ich hole mir die Namen der einzelnen Dateien der Bildsequenz) und kopiere diese Dateien dann einzeln vom SAN auf den Storage des Playbackrechners. Vor jedem Einzelkopiervorgang checke ich nochmal ob .play existiert und kopiere erst dann wenn .play nicht (mehr) existiert.
5. Nach erfolgreichem Kopiervorgang loesche ich das entsprechende Queuefile aus dem Watchfolder.
Soweit momentan mein Konzept, das jetzt auch funktioniert. Laeuft rein im Terminal ohne GUI, aber das kann ja spaeter kommen.
Meine Frage jetzt:
In dem anderen Thread habt Ihr mir ja inotify bzw. gamin empfohlen, um eben nicht ein Polling machen zu muessen. Ist unter der obigen Voraussetzung immer noch sinnvoll/moeglich? Problem ist ja dass ich an den Kernel des SANs nicht rankomme. Wie koennte ich da also was "anschubsen"?
Und habt Ihr evtl. auch sonst noch konzeptionell Ideen, was an meiner Loesung evtl. voellig umstaendlich/unnoetig ist und eleganter geloest werden koennte?
Danke fuers Zuhoeren und fuer evtl. Tipps/Anregungen! Ich weiss das ist ein wenig lang geraten, hab aber nicht so recht ne Ahnung was ich weglassen haette koennen
Hier mal meine Ausgangsaufgabenstellung:
ich arbeite im Film-Postproduction-Bereich, mache also digitale Effekte fuer Kinofilme. Hauptarbeitsmittel ist da ein grosser SAN-Storage, auf den verschiedenste Workstations (hauptsaechlich Macs) und ne Renderfarm zugreifen. Auf dem Storage liegen vor allem viele Ordner mit Einzelbildsequenzen drin.
Um die Highres-Bildsequenzen in Echtzeit anschauen zu koennen gibt es parallel dazu einen zweiten Rechner (Windows), der nen eigenen, sehr schnellen RAID-Storage hat, von dem er abspielt.
Was passieren soll ist jetzt folgendes. Die Renderfarm rechnet ne Bildsequenz, die in nem Ordner auf dem SAN landet. Diese Daten sollen jetzt nachdem sie fertig gerendert sind auf den Playbackrechner kopiert werden. Problem dabei ist: es darf nur in dem Moment kopiert werden in dem der Playbackrechner gerade nicht auf "Play" steht. Denn wenn parallel geschrieben wird ist nicht mehr zuverlaessig ein Realtime-Playback moeglich. Als Hilfsmittel, damit man weiss wann das Teil nen Playback macht, wird automatisch auf der Festplatte eine versteckte Datei (.play) angelegt, die sofort geloescht wird wenn man in der Software wieder auf "Stopp" geht.
Mein Grundkonzept sieht deshalb momentan folgendermassen aus:
1. Nach nem erfolgreichen Rendervorgang wird von der Renderfarm ein aufsteigend durchnummeriertes Textfile angelegt, das einfach den vollstaendigen Pfad zum jeweiligen zu kopierenden Ordner enthaelt.
2. Auf dem Playbackrechner hab ich mir jetzt ein Skript geschrieben, das in erstmal einfach aus ner while True-Endlosschleife besteht. Diese schaut erstmal nach ob .play gerade existiert. Wenn ja, warte ich mit sleep ein paar Sekunden und schau dann wieder nach.
3. wenn .play nicht existiert, schaue ich ob in dem Watchfolder Dateien drinliegen. Wenn ja, lese ich deren Namen per glob in ne Liste und arbeite dann jedes File ab.
4. dazu lese ich den Pfad aus den Dateien aus, lese mit glob den Inhalt des Pfadordners aus (sprich ich hole mir die Namen der einzelnen Dateien der Bildsequenz) und kopiere diese Dateien dann einzeln vom SAN auf den Storage des Playbackrechners. Vor jedem Einzelkopiervorgang checke ich nochmal ob .play existiert und kopiere erst dann wenn .play nicht (mehr) existiert.
5. Nach erfolgreichem Kopiervorgang loesche ich das entsprechende Queuefile aus dem Watchfolder.
Soweit momentan mein Konzept, das jetzt auch funktioniert. Laeuft rein im Terminal ohne GUI, aber das kann ja spaeter kommen.
Meine Frage jetzt:
In dem anderen Thread habt Ihr mir ja inotify bzw. gamin empfohlen, um eben nicht ein Polling machen zu muessen. Ist unter der obigen Voraussetzung immer noch sinnvoll/moeglich? Problem ist ja dass ich an den Kernel des SANs nicht rankomme. Wie koennte ich da also was "anschubsen"?
Und habt Ihr evtl. auch sonst noch konzeptionell Ideen, was an meiner Loesung evtl. voellig umstaendlich/unnoetig ist und eleganter geloest werden koennte?
Danke fuers Zuhoeren und fuer evtl. Tipps/Anregungen! Ich weiss das ist ein wenig lang geraten, hab aber nicht so recht ne Ahnung was ich weglassen haette koennen