あなたが提案していることは直接実行可能ではありません。新しいプロセスは制御外でスピンアップおよびスピンダウンできるため、ネイティブPythonデータをメモリに保持する方法はありません。
ただし、これを回避する方法はいくつかあります。
多くの場合、必要なのは1レベルのキー値ストレージだけです。また、値用の固定サイズのバッファ(str
として直接使用できる)がある場合もあります。 /bytes
/ bytearray
オブジェクト; struct
する必要があるその他のもの そこにあるか、そうでなければシリアル化する)が必要なすべてです。その場合、uWSGIの組み込みキャッシュフレームワークが必要なすべてを処理します。
より正確な制御が必要な場合は、SharedArea
の上にキャッシュがどのように実装されているかを確認できます。 何かをカスタマイズします。しかし、私はそれをお勧めしません。基本的に、ファイルで取得するのと同じ種類のAPIを提供します。ファイルを使用する場合の唯一の本当の利点は、サーバーがファイルの存続期間を管理することです。ファイルを許可しない言語も含め、uWSGIがサポートするすべての言語で機能します。また、後で必要になった場合に、カスタムキャッシュを分散(マルチコンピューター)キャッシュに簡単に移行できます。それらのどれもあなたに関係があるとは思いません。
フラットなキー値ストレージを取得する別の方法は、固定サイズのバッファーを使用せずに、Pythonのstdlib anydbm
を使用することです。 。 Key-Valueルックアップは、可能な限りpythonicです。これは、dict
のように見えます。 ただし、ディスク上のBDB(または同様の)データベースにバックアップされ、メモリ内のハッシュテーブルに格納されるのではなく、メモリに適切にキャッシュされます。
他のいくつかの単純なタイプを処理する必要がある場合-int
のように、非常に高速に解凍/ピクルスするもの s-shelve
を検討することをお勧めします 。
構造が十分に堅固な場合は、トップレベルにKey-Valueデータベースを使用できますが、ctypes.Structure
を介して値にアクセスします。 、またはstruct
でデ/シリアル化 。しかし、通常、それができれば、トップレベルを削除することもできます。その時点で、すべてが1つの大きなStructure
になります。 またはArray
。
その時点で、ストレージにプレーンファイル(mmap
)を使用できます。 それ(ctypes
の場合 )、または単にopen
およびread
それ(struct
の場合 )。
または、multiprocessing
を使用します の共有ctypes
Structure
にアクセスするためのオブジェクト 共有メモリ領域から直接。
一方、実際にすべてのキャッシュデータを常に必要としているわけではなく、たまに少しずつ必要な場合は、まさにそれがデータベースの目的です。繰り返しますが、anydbm
などで十分かもしれませんが、複雑な構造の場合は、ERダイアグラムを作成し、それを一連のテーブルに変換して、MySQLなどを使用してください。