Was Sie vorschlagen, ist nicht direkt machbar. Da neue Prozesse außerhalb Ihrer Kontrolle hoch- und heruntergefahren werden können, gibt es keine Möglichkeit, native Python-Daten im Speicher zu behalten.
Es gibt jedoch einige Möglichkeiten, dies zu umgehen.
Oft reicht eine Schlüsselwertspeicherebene aus. Und manchmal Puffer mit fester Größe für Werte (die Sie direkt als str
verwenden können /bytes
/bytearray
Gegenstände; alles andere müssen Sie struct
drin oder anderweitig serialisieren) ist alles, was Sie brauchen. In diesem Fall kümmert sich das integrierte Caching-Framework von uWSGI um alles, was Sie brauchen.
Wenn Sie eine genauere Kontrolle benötigen, können Sie sich ansehen, wie der Cache über SharedArea
implementiert wird und etwas anpassen. Allerdings würde ich das nicht empfehlen. Es gibt Ihnen im Grunde die gleiche Art von API, die Sie mit einer Datei erhalten, und die einzigen wirklichen Vorteile gegenüber der Verwendung einer Datei sind, dass der Server die Lebensdauer der Datei verwaltet. es funktioniert in allen uWSGI-unterstützten Sprachen, sogar in denen, die keine Dateien zulassen; und es macht es einfacher, Ihren benutzerdefinierten Cache zu einem verteilten Cache (für mehrere Computer) zu migrieren, wenn Sie dies später benötigen. Ich glaube nicht, dass diese für Sie relevant sind.
Eine andere Möglichkeit, einen flachen Schlüsselwertspeicher zu erhalten, aber ohne die Puffer mit fester Größe, ist mit Pythons stdlib anydbm
. Die Schlüsselwertsuche ist so pythonisch wie es nur geht:Sie sieht genauso aus wie ein dict
, außer dass es in einer BDB-Datenbank (oder einer ähnlichen) auf dem Datenträger gesichert und gegebenenfalls im Arbeitsspeicher zwischengespeichert wird, anstatt in einer In-Memory-Hash-Tabelle gespeichert zu werden.
Wenn Sie mit ein paar anderen einfachen Typen umgehen müssen – alles, was blitzschnell zu entpacken ist, wie int
s – vielleicht möchten Sie shelve
in Betracht ziehen .
Wenn Ihre Struktur starr genug ist, können Sie die Schlüsselwertdatenbank für die oberste Ebene verwenden, aber auf die Werte über eine ctypes.Structure
zugreifen , oder mit struct
deserialisieren . Aber normalerweise, wenn Sie das tun können, können Sie auch die oberste Ebene eliminieren, woraufhin Ihr ganzes Ding nur noch eine große Structure
ist oder Array
.
An diesem Punkt können Sie einfach eine einfache Datei zum Speichern verwenden – entweder mmap
es (für ctypes
) oder einfach open
und read
es (für struct
).
Oder verwenden Sie multiprocessing
's Shared ctypes
Objekte für den Zugriff auf Ihre Structure
direkt aus einem gemeinsam genutzten Speicherbereich.
Wenn Sie nicht ständig alle Cache-Daten benötigen, sondern ab und zu nur kleine Teile, sind Datenbanken genau dafür da. Wieder anydbm
usw. sind vielleicht alles, was Sie brauchen, aber wenn Sie eine komplexe Struktur haben, erstellen Sie ein ER-Diagramm, wandeln Sie es in eine Reihe von Tabellen um und verwenden Sie so etwas wie MySQL.