2010-03-23 6 views
8

Ich habe ziemlich Standard Django + Rabbitmq + Sellerie Setup mit 1 Sellerie Aufgabe und 5 Arbeiter.Weltweit zugängliches Objekt über alle Sellerie-Arbeiter/Memory-Cache in Django

Aufgabe Uploads das gleiche (ich vereinfache ein bisschen) große Datei (~ 100MB) asynchron zu einer Reihe von Remote-PCs.

Alles funktioniert gut auf Kosten der Verwendung von viel Speicher, da jede Aufgabe/Arbeiter diese große Datei in den Speicher separat laden.

Was ich tun möchte, ist eine Art von Cache, zugänglich für alle Aufgaben, d. H. Laden Sie die Datei nur einmal. Django Caching basierend auf Locmem wäre perfekt, aber wie Dokumentation sagt: "Jeder Prozess wird seine eigene private Cache-Instanz haben" und ich brauche diesen Cache für alle Arbeiter zugänglich.

Versucht, mit Sellerie-Signalen wie in #2129820 beschrieben zu spielen, aber das ist nicht was ich brauche.

Also die Frage ist: Gibt es eine Möglichkeit, etwas Global in Sellery zu definieren (wie eine Klasse basierend auf Diktat, wo ich die Datei oder smth laden konnte). Oder gibt es einen Django-Trick, den ich in dieser Situation anwenden könnte?

Danke.

Antwort

1

Es scheint mir, dass Sie Memcached für Django unterstützt. Auf diese Weise hat jede Aufgabe in Sellerie Zugriff darauf.

+0

Ich habe darüber nachgedacht, aber der größte Wert, den man in Memcached speichern kann, ist 1 MB. –

+0

Warum nicht die Datei partitionieren? Und wenn jede Aufgabe Zugriff auf jedes Bit dieser Datei erfordert, gibt es keine Möglichkeit, das Laden jedes Mal zu vermeiden. –

+0

Nun, ich hoffe, es ist möglich :). Die Partitionierung würde die Komplexität erhöhen und ich denke, es sollte einen einfachen Weg geben, dies anzugehen. –

0

Vielleicht können Sie Threads anstelle von Prozessen für diese bestimmte Aufgabe verwenden. Da Threads alle den gleichen Speicher teilen, benötigen Sie nur eine Kopie der Daten im Speicher, aber Sie erhalten trotzdem eine parallele Ausführung. (das bedeutet nicht Sellerie für diese Aufgabe verwenden)

2

Warum nicht einfach den Upload (s) von der Festplatte streamen, anstatt die gesamte Datei im Speicher zu laden?

+0

+1 für einen vernünftigen Vorschlag. – knutin